国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

循序漸進學爬蟲:多線程+隊列爬取豆瓣高分計算機類書籍

blastz / 1202人閱讀

摘要:上一次的抓取豆瓣高分計算機書籍的案例,采用的是完全同步的方式。是用來進行多線程編程的,也就是用來創建隊列。同時這個函數也是由多個解析線程執行。

上一次的抓取豆瓣高分計算機書籍的案例,采用的是完全同步的方式。即單個線程依次執行完所有的邏輯,這樣存在的問題就是我們的爬蟲程序會非常的慢。

所以本文作為上一次案例的升級版本,通過循序漸進、動手實踐的方式來達到更好的學習效果。

相對于上次的案例,本次主要采用多線程+隊列的方式來實現。
用到的包:
import requests
from bs4 import BeautifulSoup
import re
import numpy as np
import csv
import time
import threading
import queue

本次新增了兩個包,threading 和 queue。threading 是用來進行多線程編程的,queue 也就是用來創建隊列。至于更詳細的使用方法,可以上網自行學習。這里就不多做介紹了。

主要流程:

生成 URL

創建兩個隊列,一個用保存生成的URL(隊列1),一個保存HTML文檔(隊列2)

創建若干個線程來下載 HTML,并且保存到隊列2

創建若干個線程解析文檔

排序并保存

代碼:

以上前三個方法都沒有改動,主要是第四個和第五個。

req_page(): 用來請求url。

def req_page():
    while True:
        try:
            url = url_task.get(block=False)
            resp = requests.get(url)
            html = resp.text
            task_html.put(html)
            time.sleep(1)
        except:
            break

以上代碼會被若干個線程執行,每一個線程的流程都是不段的從 url_task 也就是我們創建的隊列1中取出一個URL,然后執行請求,并把下載到的 HTML 放入隊列2。這里有兩點要注意的。第一個點就是通過 url_task.get() 方法從隊列里拿出任務的時候,由于我們的隊列1是提前設定好的,也就是說當下載線程取任務的時候并不會發生 queue.Empty 的異常。只有當隊列中的數據被處理完的時候才會執行 except,那么線程就可以通過這個來退出。第二點是sleep這塊 ,因為請求太頻繁會被豆瓣封掉IP。

get_content():

def get_content():
    if task_html.qsize() > 10:
        while True:
            try:
                html = task_html.get(block=False)
                bs4 = BeautifulSoup(html, "lxml")
                book_info_list = bs4.find_all("li", class_="subject-item")
                if book_info_list is not None:
                    for book_info in book_info_list:
                        list_ = []
                        try:
                            star = book_info.find("span", class_="rating_nums").get_text()
                            if float(star) < 9.0:
                                continue
                            title = book_info.find("h2").get_text().replace(" ", "").replace("
", "")
                            comment = book_info.find("span", class_="pl").get_text()
                            comment = re.sub("D", "", comment)
                            list_.append(title)
                            list_.append(comment)
                            list_.append(star)
                            task_res.append(list_)
                        except:
                            continue
            except:
                break

這個函數首先判斷一下 HTML 文檔隊列(隊列2)的大小是不是大于10,目的是防止解析線程比下載線程執行的快,如果解析線程快于下載線程,那么再還沒有下載完所有的URL時,就觸發隊列的 queue.Empty異常,從而過早退出線程。中間的代碼也是上次案例中的代碼,不同之處也就是以前是從列表中讀取,現在是從隊列中讀取。同時這個函數也是由多個解析線程執行。

主函數:

# 生成分頁url
url_list = make_url(50)
# url 隊列 (隊列1)
url_task = queue.Queue()
for url in url_list:
    url_task.put(url)
# 下載好的html隊列 (隊列2)
task_html = queue.Queue()
# 最終結果列表
task_res = []
threads = []
# 獲取html線程
for i in range(5):
    threads.append(threading.Thread(target=req_page))
# 解析html線程
threads.append(threading.Thread(target=get_content))
threads.append(threading.Thread(target=get_content))
for i in threads:
    i.start()
    i.join()
# 主線程排序保存
save(_sort(task_res))

主函數的流程也就是最開始寫的五個流程。因為我們創建的所有線程都調用了 join() 方法,那么在最后執行排序和保存操作的時候,所有的子線程都已經執行完畢了。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44777.html

相關文章

  • Python爬蟲案例:抓取豆瓣編程類高評分書籍

    摘要:本文將通過來爬取豆瓣編程類評分大于的書籍。下圖是最終的結果下面進入正題一采集源分析首先我們找到豆瓣的編程類書籍網址編程進入網址之后我們翻到最下面的分頁導航通過分析分頁地址我們可以得出偏移量這個地址則是我們要采集的內容。 對于很多正在學習計算機的朋友來說,選擇合適的學習材料是非常重要的。 本文將通過 Python 來爬取豆瓣編程類評分大于 9.0 的書籍。 此案例很適合入門爬蟲的朋友學習...

    SunZhaopeng 評論0 收藏0
  • 23個Python爬蟲開源項目代碼,包含微信、淘寶、豆瓣、知乎、微博等

    摘要:今天為大家整理了個爬蟲項目。地址新浪微博爬蟲主要爬取新浪微博用戶的個人信息微博信息粉絲和關注。代碼獲取新浪微博進行登錄,可通過多賬號登錄來防止新浪的反扒。涵蓋鏈家爬蟲一文的全部代碼,包括鏈家模擬登錄代碼。支持微博知乎豆瓣。 showImg(https://segmentfault.com/img/remote/1460000018452185?w=1000&h=667); 今天為大家整...

    jlanglang 評論0 收藏0
  • Python

    摘要:最近看前端都展開了幾場而我大知乎最熱語言還沒有相關。有關書籍的介紹,大部分截取自是官方介紹。但從開始,標準庫為我們提供了模塊,它提供了和兩個類,實現了對和的進一步抽象,對編寫線程池進程池提供了直接的支持。 《流暢的python》閱讀筆記 《流暢的python》是一本適合python進階的書, 里面介紹的基本都是高級的python用法. 對于初學python的人來說, 基礎大概也就夠用了...

    dailybird 評論0 收藏0

發表評論

0條評論

blastz

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<