多執行緒糗事百科案例

2021-09-29 18:55:16 字數 4827 閱讀 7166

爬取糗事百科段子,假設頁面的url是:

要求

1.使用requests獲取頁面資訊,用xpath / re 做資料提取

3.儲存到 json 檔案內

queue(佇列物件)

1.queue是python中的標準庫,可以直接import queue引用;佇列是執行緒間最常用的交換資料的形式,對於資源,加鎖是個重要的環節。因為python原生的list,dict等,都是not thread safe的。而queue,是執行緒安全的,因此在滿足使用條件下,建議使用佇列

2.初始化: class queue.queue(maxsize) fifo 先進先出

3.包中的常用方法:  

①queue.qsize() 返回佇列的大小

②queue.empty() 如果隊列為空,返回true,反之false

③queue.full() 如果佇列滿了,返回true,反之false

④queue.full 與 maxsize 大小對應

⑤queue.get([block[, timeout]])獲取佇列,timeout等待時間

4.建立乙個「佇列」物件

import queue

myqueue = queue.queue(maxsize = 10)

5.將乙個值放入佇列中

myqueue.put(10)
6.將乙個值從佇列中取出

myqueue.get()
7.完整**

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# 使用了執行緒庫

import threading

# 佇列

from queue import queue

# 解析庫

from lxml import etree

# 請求處理

import requests

# json處理

import json

import time

class threadcrawl(threading.thread):

def __init__(self, threadname, pagequeue, dataqueue):

#threading.thread.__init__(self)

# 呼叫父類初始化方法

super(threadcrawl, self).__init__()

# 執行緒名

self.threadname = threadname

# 頁碼佇列

self.pagequeue = pagequeue

# 資料佇列

self.dataqueue = dataqueue

# 請求報頭

self.headers = 

def run(self):

print "啟動 " + self.threadname

while not crawl_exit:

try:

# 取出乙個數字,先進先出

# 可選引數block,預設值為true

#1. 如果對列為空,block為true的話,不會結束,會進入阻塞狀態,直到佇列有新的資料

#2. 如果隊列為空,block為false的話,就彈出乙個queue.empty()異常,

page = self.pagequeue.get(false)

url = "" + str(page) +"/"

#print url

content = requests.get(url, headers = self.headers).text

time.sleep(1)

self.dataqueue.put(content)

#print len(content)

except:

pass

print "結束 " + self.threadname

class threadparse(threading.thread):

def __init__(self, threadname, dataqueue, filename, lock):

super(threadparse, self).__init__()

# 執行緒名

self.threadname = threadname

# 資料佇列

self.dataqueue = dataqueue

# 儲存解析後資料的檔名

self.filename = filename

# 鎖self.lock = lock

def run(self):

print "啟動" + self.threadname

while not parse_exit:

try:

html = self.dataqueue.get(false)

self.parse(html)

except:

pass

print "退出" + self.threadname

def parse(self, html):

# 解析為html dom

html = etree.html(html)

node_list = html.xpath('//div[contains(@id, "qiushi_tag")]')

for node in node_list:

# xpath返回的列表,這個列表就這乙個引數,用索引方式取出來,使用者名稱

username = node.xpath('./div/a/@title')[0]

# 連線

image = node.xpath('.//div[@class="thumb"]//@src')#[0]

# 取出標籤下的內容,段子內容

content = node.xpath('.//div[@class="content"]/span')[0].text

# 取出標籤裡包含的內容,點讚

zan = node.xpath('.//i')[0].text

comments = node.xpath('.//i')[1].text

items = 

# with 後面有兩個必須執行的操作:__enter__ 和 _exit__

# 不管裡面的操作結果如何,都會執行開啟、關閉

# 開啟鎖、處理內容、釋放鎖

with self.lock:

# 寫入儲存的解析後的資料

self.filename.write(json.dumps(items, ensure_ascii = false).encode("utf-8") + "\n")

crawl_exit = false

parse_exit = false

def main():

# 頁碼的佇列,表示20個頁面

pagequeue = queue(20)

# 放入1~10的數字,先進先出

for i in range(1, 21):

pagequeue.put(i)

# 採集結果(每頁的html原始碼)的資料佇列,引數為空表示不限制

dataqueue = queue()

filename = open("duanzi.json", "a")

# 建立鎖

lock = threading.lock()

# 三個採集執行緒的名字

crawllist = ["採集執行緒1號", "採集執行緒2號", "採集執行緒3號"]

# 儲存三個採集執行緒的列表集合

threadcrawl = 

for threadname in crawllist:

thread = threadcrawl(threadname, pagequeue, dataqueue)

thread.start()

# 三個解析執行緒的名字

parselist = ["解析執行緒1號","解析執行緒2號","解析執行緒3號"]

# 儲存三個解析執行緒

threadparse = 

for threadname in parselist:

thread = threadparse(threadname, dataqueue, filename, lock)

thread.start()

# 等待pagequeue隊列為空,也就是等待之前的操作執行完畢

while not pagequeue.empty():

pass

# 如果pagequeue為空,採集執行緒退出迴圈

global crawl_exit

crawl_exit = true

print "pagequeue為空"

for thread in threadcrawl:

thread.join()

print "1"

while not dataqueue.empty():

pass

global parse_exit

parse_exit = true

for thread in threadparse:

thread.join()

print "2"

with lock:

# 關閉檔案

filename.close()

print "謝謝使用!"

if __name__ == "__main__":

main()

原文出處:文章的更新編輯以此鏈結為準。歡迎關注源站文章!

多執行緒爬去糗事百科

import queue import threading from fake useragent import useragent import time import requests from requests.exceptions import requestexception from l...

糗事百科案例(使用 xpath模組)

通過乙個案列先了解下json與python之間的轉換關係 json解析庫,對應到lxml import json json的解析語法,對應到xpath import jsonpath import urllib2 url request urllib2.request url,headers hea...

糗事百科 三

爸,老師讓你去學校一趟。你又闖什麼禍了!打。打抱不平來著。打抱不平?常言道虎父無犬子,真不愧是我兒子 老師 看你兒子把鮑步平小朋友打的!怎麼陪吧!記得前一陣熱播民兵葛二蛋,然後我們全家都姓葛.割了一把心酸淚.中午吃飯的時候弟弟特委屈的問我,姐姐為什麼我們全班都叫我葛二蛋?t t 我一口飯沒嚥下去,心...