網絡爬蟲-抓取1000W百度文庫doc文檔

今天抓取的是百度文庫doc文檔,但是要求確實隨機的1000萬份文檔並存爲txt文本,下載百度文庫的開源項目已經有了,那麼去哪裏找到1000萬個百度文庫doc文檔的url呢,並且在短時間內下載下來。
因爲爬蟲是一個IO密集型業務,所以使用協程效率則最高,第一時間想到了gevent。

首先分析百度文庫的url

https://wenku.baidu.com/search?word=%BD%CC%CA%A6&org=0&fd=0&lm=0&od=0&pn=10

不難發現 word爲關鍵字,pn爲當前頁數,經過測試,pn最大值爲760,超過了這個值百度文庫也不會顯示,那麼也就意味着一個關鍵字最多顯示760個url

url_list = re.findall('<a href="(.*)\?from=search', html) # 獲取關鍵詞頁面的urls

通過循環遍歷1-25000的數字,每個數字作爲關鍵詞,進行拼接url,便可以得到超過1000W的url來進行下載了。

urls = []
for i in range(1, 25000):
    for x in range(0, 760, 10):
        url = 'https://wenku.baidu.com/search/main?word={0}&org=0&fd=0&lm=1&od=0&pn={1}'.format(i, x) # lm=1爲下載doc文檔
        urls.append(url)

好了 接下來就是使用gevent協程來跑爬蟲了

import re
import sys
import time

import gevent
from gevent import monkey
from urllib.request import urlopen, Request

monkey.patch_all()
sys.setrecursionlimit(1000000)


def myspider(range1):

    urls = []
    if range1 == 50:
        range2 = 1
    else:
        range2 = range1 - 100
    for i in range(range2, range1):
        for x in range(0, 760, 10):
            url = 'https://wenku.baidu.com/search/main?word={0}&org=0&fd=0&lm=1&od=0&pn={1}'.format(i, x)
            urls.append(url)

    wenku_urls = []
    for url in urls:
        print(url)
        try:
            # r = Request(url, headers=headers)
            resp = urlopen(url)
            data = resp.read()
            list1 = re.findall('<a href="(.*)\?from=search', data.decode('gb18030'))
            wenku_urls += list1
            print(list1)
            print(url)
        except Exception as e:
            print(e)
            continue
    print(wenku_urls)
    print(len(wenku_urls))

    with open('{0}.txt'.format(range1//50), 'w', encoding='utf-8') as f:  # 記錄urls
        for i in list(set(wenku_urls)):
            f.write(i + '\n')

async_time_start = time.time()

jobs = []
for i in range(50, 25001, 50):
    jobs.append(i)
print(jobs)

job = [gevent.spawn(myspider, range1) for range1 in jobs]
gevent.joinall(job)

print("異步耗時:", time.time() - async_time_start)

啓動500個協程,瞬間跑滿了帶寬,我的辣雞電腦進過長達8個小時的奮戰,終與跑完了所有的url
在這裏插入圖片描述
在這裏插入圖片描述

Github代碼傳送門

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章