1. 程式人生 > >初級爬蟲(一) requests模組實現網頁批量圖片爬取

初級爬蟲(一) requests模組實現網頁批量圖片爬取

思路分析:
已知網頁:如http://www.jiangxian.gov.cn/N20180821093426.html
1, 檢查網頁分析網頁中圖片的地址形式,
2,獲取網頁內容,正則匹配出所有圖片的地址,
3,拼接地址生成列表
4,迴圈列表,生成圖片地址的文字檔案
5,迴圈列表,取出每個地址,獲得地址內容
6,寫入到資料夾

難點:首先是獲取每個圖片的地址____這是一個獲取過程
再次 獲取圖片____相當於獲取另一個網頁的過程

程式碼如下:

import requests
import re

#請求頭
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
}
#基礎地址
url = "http://www.jiangxian.gov.cn/N20180821093426.html"
#從網頁右鍵檢檢視到的圖片地址格式
# <P align=center><IMG src="/upload/20180821100128526.jpg"></P>
#正則分析: src="(/upload/.*?)
#初次獲取原始網頁內容
response = requests.get(url, headers=headers)
#輸出網頁內容
htm = response.content.decode('gbk')
#在網頁內容中匹配圖片的標籤(注意正則的引號,外單內雙)
list1 = re.findall('src="(/upload/.*?)"', htm)
#拼接圖片真實地址,可以在瀏覽器中點選圖片檢視地址拼接形式,列表推導式
list2 = ['http://www.jiangxian.gov.cn/' + i for i in list1]

#將地址儲存成文字,注意需要迴圈遍歷
with open('tu/tu.txt', 'w')as f:
    for t in list2:
        f.write(t+'\n')

#然後繼續遍歷列表2, 重新獲取網頁內容,分別提取每個網頁的內容輸出成圖片
for u in list2:
    resp = requests.get(u, headers=headers)
    img = resp.content
    #命名 (難點是字串和int型別的值之間的轉換)
    name = 'tu' + str(list2.index(u)) + '.jpg'
    # print(name)測試
    #拼接圖片庫地址
    path = './tu/' + name

    File = open(path, 'wb')
    File.write(img)
    File.flush()
    File.close()


    #寫入的另一種形式
    # with open(path, 'wb')as w:
    #     w.write(img)

#問題: 怎麼實現邊讀取邊寫入?執行發現是全部讀取完後一次性寫入 ,不科學啊 ,目前不知道怎麼解決

結果