国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python面向?qū)ο蠖嗑€程爬蟲爬取搜狐頁面的實(shí)例代碼

2020-02-15 21:36:39
字體:
供稿:網(wǎng)友

首先我們需要幾個包:requests, lxml, bs4, pymongo, redis

1. 創(chuàng)建爬蟲對象,具有的幾個行為:抓取頁面,解析頁面,抽取頁面,儲存頁面

class Spider(object): def __init__(self):  # 狀態(tài)(是否工作)  self.status = SpiderStatus.IDLE # 抓取頁面 def fetch(self, current_url):  pass # 解析頁面 def parse(self, html_page):  pass # 抽取頁面 def extract(self, html_page):  pass # 儲存頁面 def store(self, data_dict):  pass

2. 設(shè)置爬蟲屬性,沒有在爬取和在爬取中,我們用一個類封裝, @unique使里面元素獨(dú)一無二,Enum和unique需要從 enum里面導(dǎo)入:

@uniqueclass SpiderStatus(Enum): IDLE = 0 WORKING = 1

3. 重寫多線程的類:

class SpiderThread(Thread): def __init__(self, spider, tasks):  super().__init__(daemon=True)  self.spider = spider  self.tasks = tasks def run(self):  while True:   pass

4. 現(xiàn)在爬蟲的基本結(jié)構(gòu)已經(jīng)做完了,在main函數(shù)創(chuàng)建tasks, Queue需要從queue里面導(dǎo)入:

def main(): # list沒有鎖,所以使用Queue比較安全, task_queue=[]也可以使用,Queue 是先進(jìn)先出結(jié)構(gòu), 即 FIFO task_queue = Queue() # 往隊(duì)列放種子url, 即搜狐手機(jī)端的url task_queue.put('http://m.sohu,com/') # 指定起多少個線程 spider_threads = [SpiderThread(Spider(), task_queue) for _ in range(10)] for spider_thread in spider_threads:  spider_thread.start() # 控制主線程不能停下,如果隊(duì)列里有東西,任務(wù)不能停, 或者spider處于工作狀態(tài),也不能停 while task_queue.empty() or is_any_alive(spider_threads):  pass print('Over')

4-1. 而 is_any_threads則是判斷線程里是否有spider還活著,所以我們再寫一個函數(shù)來封裝一下:

def is_any_alive(spider_threads): return any([spider_thread.spider.status == SpiderStatus.WORKING    for spider_thread in spider_threads])

5. 所有的結(jié)構(gòu)已經(jīng)全部寫完,接下來就是可以填補(bǔ)爬蟲部分的代碼,在SpiderThread(Thread)里面,開始寫爬蟲運(yùn)行 run 的方法,即線程起來后,要做的事情:

 def run(self):  while True:   # 獲取url   current_url = self.tasks_queue.get()   visited_urls.add(current_url)   # 把爬蟲的status改成working   self.spider.status = SpiderStatus.WORKING   # 獲取頁面   html_page = self.spider.fetch(current_url)   # 判斷頁面是否為空   if html_page not in [None, '']:    # 去解析這個頁面, 拿到列表    url_links = self.spider.parse(html_page)    # 把解析完的結(jié)構(gòu)加到 self.tasks_queue里面來    # 沒有一次性添加到隊(duì)列的方法 用循環(huán)添加算求了    for url_link in url_links:     self.tasks_queue.put(url_link)   # 完成任務(wù),狀態(tài)變回IDLE   self.spider.status = SpiderStatus.IDLE

6.  現(xiàn)在可以開始寫 Spider()這個類里面的四個方法,首先寫fetch()抓取頁面里面的:  

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 凌海市| 鄂温| 湖南省| 钟山县| 静乐县| 伽师县| 富蕴县| 湘乡市| 保山市| 交城县| 海伦市| 根河市| 泾阳县| 宜良县| 江津市| 仙桃市| 息烽县| 儋州市| 盐源县| 南木林县| 雅安市| 永川市| 新建县| 中阳县| 泉州市| 井陉县| 南城县| 邛崃市| 酒泉市| 长治县| 芜湖市| 庆城县| 岳池县| 南乐县| 马鞍山市| 项城市| 玛曲县| 赤峰市| 蛟河市| 郁南县| 上蔡县|