python—多協程爬取糗事百科熱圖
阿新 • • 發佈:2019-02-19
wow64 monk 根據 list 網址 real span 本地 uil
今天在使用正則表達式時未能解決實際問題,於是使用bs4庫完成匹配,通過反復測試,最終解決了實際的問題,加深了對bs4.BeautifulSoup模塊的理解。
爬取流程
前奏:
分析糗事百科熱圖板塊的網址,因為要進行翻頁爬取內容,所以分析不同頁碼的網址信息是必要的
具體步驟:
1,獲取網頁內容(urllib.request)# 糗事百科有發爬蟲技術,所以要添加headers,偽裝程瀏覽器
2,解析網頁內容,獲取圖片鏈接(from bs4 import BeautifulSoup)
3,通過圖片鏈接下載圖片(urllib.request),並存儲到本地
備註:
具體的爬取說明在代碼都有詳細的解釋
1import urllib.request 2 import requests 3 from bs4 import BeautifulSoup 4 # import re 5 import gevent 6 from gevent import monkey 7 import bs4 8 9 monkey.patch_all() 10 11 12 def get_html_text(url, raw_html_text, depth): 13 14 # 爬取網頁數據 15 16 # 糗事百科有反爬蟲機制,需要設置請求頭偽裝成瀏覽器17 hd = (‘User-Agent‘,‘Mozilla/5.0(Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Ch rome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0‘) 18 19 # 創建opener對象 20 opener = urllib.request.build_opener() 21 opener.addheaders = [hd] 22 23 # 將opener對象設置為全局 24 urllib.request.install_opener(opener)25 26 # 翻頁爬取html_text 27 for i in range(depth): 28 # 根據對網址的分析,構造符合翻頁時的網址 29 url_real = url + str(i+1) 30 try: 31 html_data = urllib.request.urlopen(url_real).read().decode(‘utf-8‘, ‘ignore‘) 32 raw_html_text.append(html_data) 33 # 測試代碼 34 # print(len(html_data)) 35 except Exception as result: 36 print(‘錯誤類型:‘, result) 37 38 print(‘提取網頁信息完成...‘) 39 return raw_html_text 40 # 測試代碼 41 # print(len(raw_html_text)) 42 43 44 def parser_html_text(raw_html_text, done_img): 45 46 # 對爬取的網頁數據進行遍歷 47 48 for html_text in raw_html_text: 49 # 使用BeautifulSoup對網頁進行解析 50 soup = BeautifulSoup(html_text, ‘html.parser‘) 51 # 使用soup.find_all(‘div‘,‘thumb‘) 查找出每個網頁中所有標簽是div,屬性值是thumb的標簽 52 # 通過對網頁源代碼的分析,圖片信息都存儲在該標簽下的孫子標簽img中的屬性src中 53 # 遍歷每個div標簽 54 for tag in soup.find_all(‘div‘, ‘thumb‘): 55 # 判斷 tag 是否是bs4.element.Tag屬性,因為在標簽div下,並不是全部是標簽 56 if isinstance(tag, bs4.element.Tag): 57 # 遍歷每個div標簽下的所有孫子標簽 58 for img in tag.descendants: 59 # 判斷標簽的名字是不是‘img’,如果是,取出標簽中屬性src的屬性值。 60 if img.name == ‘img‘: 61 link = img.get(‘src‘) 62 done_img.append(link) 63 #測試代碼 64 #print(done_img) 65 print(‘網頁解析完成...‘) 66 return done_img 67 68 def save_crawler_data(done_img): 69 # 將目標文本存儲到本地‘./’表示當前目錄 70 path = ‘./img/‘ 71 # enumerate(list) 返回索引及索引對應的列表內的元素 72 for i,j in enumerate(done_img): 73 # 分析爬取的鏈接,前面缺少‘https:’,使用字符串拼接 74 j =‘https:‘ + j 75 # 通過urllib.request.urlopen()下載圖片 76 try: 77 img_data = urllib.request.urlopen(j).read() 78 path_real = path + str(i+1) 79 with open(path_real, ‘wb‘) as f: 80 f.write(img_data) 81 except: 82 continue 83 print(‘圖片存儲完成‘) 84 85 86 def main(): 87 url = ‘https://www.qiushibaike.com/imgrank/page/‘ 88 depth = 20 89 raw_html_text = list() 90 done_img = list() 91 Raw_html_text = get_html_text(url, raw_html_text, depth) 92 Done_img = parser_html_text(Raw_html_text, done_img) 93 gevent.joinall([ 94 gevent.spawn(get_html_text,url,raw_html_text,depth), 95 gevent.spawn(parser_html_text,Raw_html_text,done_img), 96 gevent.spawn(save_crawler_data,Done_img) 97 ]) 98 99 save_crawler_data(done_img) 100 101 102 if __name__ == ‘__main__‘: 103 main()
python—多協程爬取糗事百科熱圖