1. 程式人生 > >使用threading,queue,fake_useragent,requests ,lxml,多執行緒爬取嗅事百科13頁文字資料,爬蟲案例

使用threading,queue,fake_useragent,requests ,lxml,多執行緒爬取嗅事百科13頁文字資料,爬蟲案例

#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()