使用threading,queue,fake_useragent,requests ,lxml,多執行緒爬取嗅事百科13頁文字資料,爬蟲案例
阿新 • • 發佈:2018-12-21
#author:huangtao # coding=utf-8 #多執行緒庫 from threading import Thread #佇列庫 from queue import Queue #請求庫 from fake_useragent import UserAgent #訪問庫 import requests #etree庫,lxml解析 from lxml import etree #爬蟲類 class CrawlInfo(Thread): # 定義init傳遞引數url_queue,html_queue def __init__(self,url_queue,html_queue): #通過主程式中存放容器調取引數 Thread.__init__(self) self.url_queue = url_queue self.html_queue = html_queue #定義執行緒啟動 def run(self): #隨機請求頭 headers= {'User-Agent':UserAgent().random} #判斷url佇列中是否為空,不為空繼續訪問 while self.url_queue.empty() == False: #訪問網頁 res =requests.get(self.url_queue.get(),headers=headers) #判斷訪問返回的狀態碼是否為200 if res.status_code ==200: #判斷為200的話,把返回的網頁text放到html_queue佇列中 self.html_queue.put(res.text) #解析類 class ParseInfo(Thread): # 定義init傳遞引數html_queue def __init__(self,html_queue): # 通過主程式中存放容器調取引數 Thread.__init__(self) self.html_queue = html_queue # 定義執行緒啟動 def run(self): # 判斷html佇列中是否為空,不為空繼續訪問 while self.html_queue.empty() == False: #把html的返回的資訊解析定義為e e = etree.HTML(self.html_queue.get()) #使用lxml解析content content = e.xpath('//div[@class="content"]/span[1]') #但是content結構有問題,迴圈一下content for span in content: #轉化字串 info = span.xpath('string(.)') #列印內容 print(info) if __name__ == '__main__': #儲存url的容器 url_queue = Queue() #儲存內容 html_queue = Queue() #起始的url,通過下面的迴圈遍歷構造new_url base_url = 'https://www.qiushibaike.com/text/page/{}/' for i in range(1,14): new_url = base_url.format(i) #url_queue佇列中放入構造的新的new_url url_queue.put(new_url) #建立爬蟲 #定義一個craw1_list列表 craw1_list = [] #建立3個爬取網頁的執行緒 for i in range(0,3): #3個執行緒 craw1 = CrawlInfo(url_queue,html_queue) craw1_list.append(craw1) #執行緒開始 craw1.start() #craw1_list列表,不加的話,爬取網頁的執行緒只能走一遍就關閉了,所以要加個Join等待執行緒 for craw1 in craw1_list: craw1.join() #定義一個parse_list的列表 parse_list = [] #建立解析的執行緒 for i in range(0, 3): parse = ParseInfo(html_queue) parse_list.append(parse) parse.start() # parse_list列表,不加的話,解析的執行緒只能走一遍就關閉了,所以要加個Join等待執行緒 for parse in parse_list: parse.join()