## 安装爬虫需要的包
```
sudo pip install BeautifulSoup
pip install requests
sudo apt-get install python-lxml # 使用系统包管理器安装
```
> 其中,BeautifulSoup是用来获取一个页面里各个标签里面的内容,我们主要用到它里面的find(),find_All()函数。具体用法在后面介绍。
requests是用来获取网页信息的,我们给它一个url,它能把这个url对应的页面信息全部反馈给我们,我们再用BeautifulSoup里的函数对它们进行处理。
lxml是一个解析器,Python里有专门的解析器,html.parser,但是lxml的解析速度更快,建议用lxml。
## 批量爬取页面数据
我们打开[百度图片](http://image.baidu.com/search/index),在里面搜索要爬取图片的关键词,例如“杨紫”,然后敲回车。
<div align="center"><img src="images/27.png"/></div>
跳转到图片搜索结果界面,右键按**F12**,如果不行就**Fn+F12**打开开发者工具。我们将鼠标放在图片搜索结果界面(标1部分),滑动鼠标滚轮。可以看到随着滑动,标2部分不断显示加载的具体文件。
<div align="center"><img src="images/28.png"/></div>
然后我们点击这些具体文件,然后展开“**Query String Parameters**”。
<div align="center"><img src="images/31.png"/></div>
可以看到不同文件里面pn是不同的,我们在图片搜索地址中加入“**&pn=30**”,,回车。
<div align="center"><img src="images/32.png"/></div>
搜索结果是“杨紫”,如果将&pn=30替换成“**&pn=0**”,回车后会发现到我们首次搜索结果的界面。这里pn就是第几页的参数。
在图片搜索结果界面,鼠标右键**查看网页源代码**(如果你用的是谷歌浏览器)。
<div align="center"><img src="images/29.png"/></div>
然后按**Ctrl+F**,在搜索框中输入“**objURL**”。如下图红框中的就是我们要爬取的图片。
<div align="center"><img src="images/30.png"/></div>
现在我们写一个正则表达式,来快速获取所有objURL后面的图片地址,代码如下所示。
```python
pic_url = re.findall('"objURL":"(.[^\"]*?)",' html, re.S)
```
### step1: 获取要爬取的网页的内容
导入需要的包
```python
# -*- coding:utf-8 -*-
# picture.py
from bs4 import BeautifulSoup
import requests
import re
import os
import sys
import time
```
主函数
```python
if __name__ == '__main__': # 主函数入口
word = raw_input("输入搜索图片关键词:")
num = int(raw_input("输入最多下载多少页图片:"))
li = []
li = get_page(word, num) # 爬取具体页面的图片url
download_Image(li) # 下载图片到本地
```
### step2: 爬取具体页面的图片
<p id="color" style="color:red">我们要爬取一个页面,首先需要知道他的URL,然后发送post请求,....</p>
```python
# 要抓取网页url
url = "http://image.baidu.com/search/index"
# 伪装浏览器
headers = {
'User-Agent':'Mozilla/5.0(Windows NT 6.3; WOW64) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
}
def get_page(word, num):
url1 = url + '&word=' + str(word) + '&pn='
n = 0
li = [] # 创建一个空列表
while n < num:
pn = n*30 # url中的pn参数
new_url = url1 + str(pn)
# 获取某个网页内容,发送Post请求
res = requests.post(new_url, headers=headers, timeout=10)
content = res.content # 返回二进制响应内容
# 利用正则表达式,找出图片的url。pic_url是一个列表
pic_url = re.findall('"objURL":"(.*?)"', content, re.S)
#print(pic_url)
li = li + pic_url # 将多个图片url列表合成一个列表
n = n + 1
print(li)
return li
```
运行picture.py文件
```
python picture.py
```
按打印提示输入搜索的关键词,下载页数(根据自己情况输入)。回车后我们将得到包含图片url的列表,如下图所示。
<div align="center"><img src="images/33.png"/></div>
### 下载图片
现在来写下载图片的函数download_Image()
我们前面得到了包含图片url的列表,列表中的每个元素都是图片的url地址。我们遍历列表,然后将其url爬取,将下载的图片保存到本地就可以了。实现函数代码如下
```python
def downloadPicture(li):
num = 0
path = './photo' # 图片需要保存的路径
if os.path.exists(path) == False: # 如果photo文件不存在,创建一个
os.makedirs(path)
for pic_url in li:
print('正在下载第 '+ str(num+1)+'张图片, 图片地址:'+str(url))
try:
pic = request.post(pic_url, headers)
content = pic.content
else:
continue
except BaseException as e:
print("错误, 当前图片无法下载")
print('except:', e)
continue
else:
file_name = r'img_' + str(num) + '.jpg'
img_file_name = os.path.join(path, file_name)
fp = open(img_file_name, 'wb')
fp.write(content)
fp.close()
num += 1
```
运行程序 picture.py
```
python picture.py
```
按照打印提示输入关键词,如“杨紫”,下载多少页,如输入“1”。
这样就爬取了百度上有关杨紫的的30张图片,并保存到了本地,如下图。
<div align="center"><img src="images/34.png"/></div>
- 前言
- 第一章 树莓派快速入门
- 1. 初识树莓派3B+
- 2. 烧录系统
- 3. 树莓派连接键盘鼠标和显示器
- 4. 启动树莓派
- 5.树莓派连接网络
- 6. Windows远程访问树莓派
- 7. 终端通过raspi-config配置树莓派
- 第二章 树莓派编程
- 1. Linux入门操作
- 常用的linux命令
- 重要的快捷键
- 通过命令安装软件
- 树莓派关机/重启
- 2. 创建、编辑和保存文件
- 3. 创建并运行Python程序
- 4. 使用树莓派的GPIO口
- 第三章 树莓派套件应用
- 树莓派3B+ IO扩展板介绍
- 家居系统
- 会呼吸的RGB灯
- 树莓派控制家电
- 制作一个环境检测仪
- 树莓派摄像头做远程监控
- 摄像头使用
- socket通信
- PiCamera + socket远程监控
- AI语音
- 配置snowboy
- 自定义响应
- 采集语音和语音播放
- 语音机器人
- 图灵机器人
- 俄罗斯方块小游戏
- pygame基本使用
- ADKeyboard使用
- 俄罗斯方块实现原理
- 俄罗斯方块代码讲解
- 手势控制的树莓派相册
- 模块介绍
- 爬取图片
- 电子相册
- 附录
- 网址