多執行緒爬去糗事百科

2021-09-11 06:42:16 字數 3756 閱讀 1472

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 網上是這麼說的 需要注意的是,傳入的是乙個字元陣列,編譯器去除兩端所有相應的字...