## 安裝爬蟲需要的包
```
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使用
- 俄羅斯方塊實現原理
- 俄羅斯方塊代碼講解
- 手勢控制的樹莓派相冊
- 模塊介紹
- 爬取圖片
- 電子相冊
- 附錄
- 網址