# coding=utf-8
import requests
from lxml import etree
import json
import threading
from queue import Queue
import time
class XiuShi(object):
"""抓取糗事百科"""
def __init__(self):
self.url = 'https://www.qiushibaike.com/8hr/page/{}'
self.headers = {
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'
}
self.file = open('qiushi.json', 'w')
self.url_list_queue = Queue()
self.get_data_queue = Queue()
self.parse_page_queue = Queue()
def url_list(self):
print('正在生成url列表')
for i in range(1, 14):
url = self.url.format(i)
# 將url新增到佇列
self.url_list_queue.put(url)
def get_data(self):
while True:
print('正在傳送請求')
# 從佇列中獲取url
url = self.url_list_queue.get()
response = requests.get(url, headers=self.headers)
# 如果返回的響應狀態碼是503
if response.status_code == 503:
self.url_list_queue.put(url)
else:
# print(response.content)
resp_data = response.content
# 將response新增到佇列
self.get_data_queue.put(resp_data)
# 宣告子執行緒結束
self.url_list_queue.task_done()
def parse_page(self):
while True:
print('正在解析資料')
# 從佇列中獲取response響應資料
data = self.get_data_queue.get()
# 生成xpath物件
html = etree.HTML(data)
# 解析所有帖子的結點
node_list = html.xpath('//*[contains(@id,"qiushi_tag_")]')
qiushi_list = []
for node in node_list:
qiu_dict = dict()
try:
qiu_dict['user'] = node.xpath('./div[1]/a[2]/h2/text()')[0].strip()
qiu_dict['age'] = node.xpath('./div[1]/div/text()')[0]
qiu_dict['url'] = 'https://www.qiushibaike.com' + node.xpath('./div[1]/a[1]/@href')[0]
qiu_dict['gender'] = node.xpath('./div[1]/div/@class')[0].split(' ')[-1]
except:
qiu_dict['user'] = '匿名使用者'
qiu_dict['age'] = None
qiu_dict['url'] = None
qiu_dict['gender'] = None
qiu_dict['content'] = ''.join(node.xpath('./a/div/span/text()')).strip()
qiushi_list.append(qiu_dict)
# 將解析的資料儲存到佇列
self.parse_page_queue.put(qiushi_list)
# 宣告子執行緒結束
self.get_data_queue.task_done()
def save_data(self):
while True:
print('正在儲存資料')
# 從佇列中獲取要儲存的資料
qiushi_list = self.parse_page_queue.get()
for qiushi in qiushi_list:
# print(qiushi)
# 轉化為json資料
json_data = json.dumps(qiushi, ensure_ascii=False) + ',\n'
print(json_data)
self.file.write(json_data)
# time.sleep(3)
# 宣告子執行緒結束
self.parse_page_queue.task_done()
def __del__(self):
"""關閉檔案"""
self.file.close()
def run(self):
# urls = self.url_list()
# for url in urls:
# data = self.get_data(url)
# qiushi_list = self.parse_page(data)
# self.save_data(qiushi_list)
threading_list = []
# 建立生成url的執行緒
urls = threading.Thread(target=self.url_list)
threading_list.append(urls)
# 建立請求的執行緒
for i in range(1, 4):
data = threading.Thread(target=self.get_data)
threading_list.append(data)
# 建立解析的執行緒
for i in range(1, 4):
qiushi_list = threading.Thread(target=self.parse_page)
threading_list.append(qiushi_list)
# 建立儲存的執行緒
save = threading.Thread(target=self.save_data)
threading_list.append(save)
for t in threading_list:
# 將子執行緒設定為守護主執行緒,即主執行緒死亡,子執行緒就死亡
t.setDaemon(True)
# 執行執行緒
t.start()
# 設定主執行緒等待結束的條件
for q in (self.url_list_queue, self.get_data_queue, self.parse_page_queue):
q.join()
if __name__ == '__main__':
qiu = XiuShi()
qiu.run()複製程式碼
python多執行緒爬去糗事百科
相關文章
- python爬取糗事百科Python
- python爬蟲爬取糗事百科Python爬蟲
- Python爬取糗事百科段子Python
- Python 爬蟲 (四) --多執行緒Python爬蟲執行緒
- python爬蟲十二:middlewares的使用,爬取糗事百科Python爬蟲
- Python《多執行緒併發爬蟲》Python執行緒爬蟲
- python多執行緒爬蟲與單執行緒爬蟲效率效率對比Python執行緒爬蟲
- 網路爬蟲——爬取糗事百科笑料段子爬蟲
- python爬蟲學習(1)-抓取糗事百科笑話Python爬蟲
- Python 爬蟲 (五) --多執行緒續 (Queue )Python爬蟲執行緒
- python爬蟲入門八:多程式/多執行緒Python爬蟲執行緒
- python3.6.5 爬取糗事百科,開心一下Python
- Python資料分析之糗事百科Python
- python多執行緒Python執行緒
- Python 多執行緒Python執行緒
- python爬蟲之多執行緒、多程式+程式碼示例Python爬蟲執行緒
- Python爬蟲入門【9】:圖蟲網多執行緒爬取Python爬蟲執行緒
- Python爬蟲入門【10】:電子書多執行緒爬取Python爬蟲執行緒
- Python 多執行緒多程式Python執行緒
- 簡易多執行緒爬蟲框架執行緒爬蟲框架
- 多執行緒爬蟲實現(上)執行緒爬蟲
- 網路爬蟲——專案實戰(爬取糗事百科所有文章)爬蟲
- 如何使用python多執行緒有效爬取大量資料?Python執行緒
- Python3多執行緒爬蟲例項講解Python執行緒爬蟲
- python多執行緒示例Python執行緒
- python多執行緒中:如何關閉執行緒?Python執行緒
- Python——程式、執行緒、協程、多程式、多執行緒(個人向)Python執行緒
- 【Python】 多程式與多執行緒Python執行緒
- python多執行緒程式設計1— python對多執行緒的支援Python執行緒程式設計
- 多執行緒爬取B站視訊執行緒
- 資料提取方法-多程式多執行緒爬蟲執行緒爬蟲
- 多執行緒和多執行緒同步執行緒
- 如何爬取 python 進行多執行緒跑資料的內容Python執行緒
- python多執行緒非同步爬蟲-Python非同步爬蟲試驗[Celery,gevent,requests]Python執行緒非同步爬蟲
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- 執行緒與多執行緒執行緒