本篇內容介紹了“Python多進程批量爬取小說代碼分享”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
為五蓮等地區用戶提供了全套網頁設計制作服務,及五蓮網站建設行業解決方案。主營業務為做網站、成都網站設計、五蓮網站設計,以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業、用心的態度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
使用python多進程跑同樣的代碼。
python中的多線程其實并不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進程。Python提供了非常好用的多進程包multiprocessing,只需要定義一個函數,Python會完成其他所有事情。借助這個包,可以輕松完成從單進程到并發執行的轉換。multiprocessing支持子進程、通信和共享數據、執行不同形式的同步,提供了Process、Queue、Pipe、Lock等組件。
創建進程的類:Process([group [, target [, name [, args [, kwargs]]]]]),target表示調用對象,args表示調用對象的位置參數元組。kwargs表示調用對象的字典。name為別名。group實質上不使用。
方法:is_alive() 、join([timeout])、run()、start()、terminate()。其中,Process以start()啟動某個進程。
is_alive():判斷該進程是否還活著
join([timeout]):主進程阻塞,等待子進程的退出, join方法要在close或terminate之后使用。
run():進程p調用start()時,自動調用run()
屬性:authkey、daemon(要通過start()設置)、exitcode(進程在運行時為None、如果為–N,表示被信號N結束)、name、pid。其中daemon是父進程終止后自動終止,且自己不能產生新進程,必須在start()之前設置。
下面的demo。爬取筆趣閣小說網,只是爬了4本小說,同時啟動四個線程。啟動的方式有點low.為了統計時間,所以就那么寫, 有什么更好的方法可以留言,歡迎指導。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2019/1/3 17:15
# @Author : jia.zhao
# @Desc :
# @File : process_spider.py
# @Software: PyCharm
from multiprocessing import Process, Lock, Queue
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
from lxml import etree
exitFlag = 0
q = Queue()
chrome_options = Options()
chrome_options.add_argument('--headless')
class scrapy_biquge():
def get_url(self):
browser = webdriver.Chrome(chrome_options=chrome_options)
browser.get('http://www.xbiquge.la/xuanhuanxiaoshuo/')
# 獲取小說
content = browser.find_element_by_class_name("r")
content = content.find_elements_by_xpath('//ul/li/span[@class="s2"]/a')
for i in range(len(content)):
# 小說名字
title = content[i].text
# 小說的url
href = content[i].get_attribute('href')
print(title + '+' + href)
# 裝進隊列
q.put(title + '+' + href)
if i == 3:
break
browser.close()
browser.quit()
def get_dir(title, href):
time.sleep(2)
res = requests.get(href, timeout=60)
res.encoding = 'utf8'
novel_contents = etree.HTML(res.text)
novel_dir = novel_contents.xpath('//div[@id="list"]/dl/dd/a//text()')
novel_dir_href = novel_contents.xpath('//div[@id="list"]/dl/dd/a/@href')
path = 'novel/' + title + '.txt'
list_content = []
i = 0
for novel in range(len(novel_dir)):
novel_dir_content = get_content('http://www.xbiquge.la'+novel_dir_href[novel])
print(title, novel_dir[novel])
list_content.append(novel_dir[novel] + '\n' + ''.join(novel_dir_content) + '\n')
i = i + 1
if i == 2:
try:
with open(path, 'a', encoding='utf8') as f:
f.write('\n'.join(list_content))
f.close()
list_content = []
i = 0
except Exception as e:
print(e)
def get_content(novel_dir_href):
time.sleep(2)
res = requests.get(novel_dir_href, timeout=60)
res.encoding = 'utf8'
html_contents = etree.HTML(res.text)
novel_dir_content = html_contents.xpath('//div[@id="content"]//text()')
return novel_dir_content
class MyProcess(Process):
def __init__(self, q, lock):
Process.__init__(self)
self.q = q
self.lock = lock
def run(self):
print(self.q.qsize(), '隊列大小')
print('Pid: ' + str(self.pid) + ' LoopCount: ')
self.lock.acquire()
while not self.q.empty():
item = self.q.get()
print(item)
self.lock.release()
title = item.split('+')[0]
href = item.split('+')[1]
try:
get_dir(title, href)
except Exception as e:
print(e, '出現異常跳過循環')
continue
if __name__ == '__main__':
start_time = time.time()
print(start_time)
scrapy_biquge().get_url()
lock = Lock()
p0 = MyProcess(q, lock)
p0.start()
p1 = MyProcess(q, lock)
p1.start()
p2 = MyProcess(q, lock)
p2.start()
p3 = MyProcess(q, lock)
p3.start()
p0.join()
p1.join()
p2.join()
p3.join()
end_time = time.time()
print(start_time, end_time, end_time - start_time, '時間差')
使用多進程中的隊列處理,實現進程間數據共享。代碼應該可以直接運行
,有問題可以留言“Python多進程批量爬取小說代碼分享”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注創新互聯網站,小編將為大家輸出更多高質量的實用文章!
本文名稱:Python多進程批量爬取小說代碼分享
文章網址:http://www.yijiale78.com/article12/jdogdc.html
成都網站建設公司_創新互聯,為您提供網站內鏈、、外貿網站建設、網站制作、虛擬主機、建站公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯