import queue
import threading
from fake_useragent import useragent
import time
import requests
from requests.exceptions import requestexception
from lxml import etree
import json
# 2個佇列
# 兩個執行緒類
# 爬蟲執行緒的退出標誌
spider_exit_flag =
false
parse_exit_flag =
false
lock = threading.lock(
)# 爬蟲執行緒
class
spiderthread
(threading.thread)
:def
__init__
(self, spider_queue, data_queue,id,
*args,
**kwargs)
:super()
.__init__(
*args,
**kwargs)
self.spider_queue = spider_queue
self.data_queue = data_queue
self.id=
iddef
run(self)
:# 從spider_queue中不停的拿資料,然後爬取,然後爬取的內容存到data_queue中.
while
true
:global spider_exit_flag
if spider_exit_flag:
break
try:
url = self.spider_queue.get(block=
false
)# 開始爬
times =
3while times >=0:
try:
response = requests.get(url, timeout=10)
self.data_queue.put(response.text)
print
(f'號執行緒成功獲取的資料'
)# 放慢一下爬蟲的速度
time.sleep(1)
self.spider_queue.task_done(
)# 只要成功一次就不用再試
break
except requestexception:
# 說明請求不成功
times -=
1except exception as e:
pass
# 解析執行緒
class
parsethread
(threading.thread)
:def
__init__
(self, data_queue,
id, fp,
*args,
**kwargs)
:super()
.__init__(
*args,
**kwargs)
self.data_queue = data_queue
self.id=
id self.fp = fp
defrun(self)
:# 不停的從data_queue中取資料
while
true
:global parse_exit_flag
if parse_exit_flag:
break
try:
data = self.data_queue.get(block=
false
)# 用xpath提取資料
# 把解析的過程封裝成乙個函式 parse
self.parse(data)
print
(f'號解析執行緒解析成功'
)# 等事情都做完之後才告訴佇列可以釋放佇列鎖.
self.data_queue.task_done(
)except queue.empty:
pass
defparse
(self, data)
: html = etree.html(data)
div_list = html.xpath(
'//div[contains(@id, "qiushi_tag_")]'
)# 對div_list遍歷
items =
for div in div_list:
img = div.xpath(
'.//img[1]/@src'
) name = div.xpath(
'.//h2')[
0].text.strip(
) content = div.xpath(
'.//div[@class="content"]/span')[
0].text.strip(
) item =
item[
'img'
]= img
item[
'name'
]= name
item[
'content'
]= content
result =
# 寫入檔案
global lock
with lock:
self.fp.write(json.dumps(result, ensure_ascii=
false)+
'\n'
)def
main()
:# 建立佇列
spider_queue = queue.queue(12)
# data_queue
data_queue = queue.queue(12)
base_url =
''for i in
range(1
,13):
url = base_url % i
spider_queue.put(url)
# 建立執行緒
for i in
range(3
):spiderthread(spider_queue, data_queue, i)
.start(
) fp =
open
('./qiushi.json'
,'a'
, encoding=
'utf-8'
)for i in
range(3
):parsethread(data_queue, i, fp)
.start(
)# 佇列鎖
spider_queue.join(
)global spider_exit_flag
spider_exit_flag =
true
data_queue.join(
)global parse_exit_flag
parse_exit_flag =
true
# 關閉檔案
fp.close(
)if __name__ ==
'__main__'
: main(
)
python爬去糗事百科
1.用requests beautifulsoup抓取糗事百科的文字內容 2.將抓取的內容寫入txt。1.獲取網頁源 def get html url 用requests庫得到網頁源 html requests.get url text return html 2.檢視源 結構找到要抓取的目標 3....
多執行緒糗事百科案例
爬取糗事百科段子,假設頁面的url是 要求 1.使用requests獲取頁面資訊,用xpath re 做資料提取 3.儲存到 json 檔案內 queue 佇列物件 1.queue是python中的標準庫,可以直接import queue引用 佇列是執行緒間最常用的交換資料的形式,對於資源,加鎖是個...
簡單爬取糗事百科
剛剛入門,對於爬蟲還要折騰很久才行,雖然很多功能還沒開始掌握,但是爬取下來就很開心,接下來還會爭取進步的。把自己出現的一些錯誤都加上了注釋,我目前還在學習當中,大家一起進步。期間學了乙個新的函式,在這裡分享下 strip 網上是這麼說的 需要注意的是,傳入的是乙個字元陣列,編譯器去除兩端所有相應的字...