1. 程式人生 > 實用技巧 >爬蟲抓取部落格園前10頁標題帶有Python關鍵字(不區分大小寫)的文章

爬蟲抓取部落格園前10頁標題帶有Python關鍵字(不區分大小寫)的文章

寫一個簡易的爬蟲程式,抓取部落格園網站首頁前10頁中所有文章標題帶有Python關鍵字(不區分大小寫)的文章,並把文章連結和文章標題存入硬碟,要求如下:

  1. 使用正則表示式匹配出需要的資料,然後對資料進行解析
  2. 程式中很明顯有多個任務,這多個任務必須是非同步呼叫
  3. 任務的返回值要及時處理,不能等所有任務都執行完再統一處理
  4. 提示資訊:可以使用生產者消費者模型來處理
  5. 儘可能提升程式的執行效率

爬蟲儲備知識:
requests模組是一個非常強大的爬蟲模組,它的基本使用非常簡單,但是它是所有爬蟲程式的根源,我們只需要使用requests模組裡面級簡單的功能就能完成,用法可以通過查詢得知。

"""
寫一個簡易的爬蟲程式,抓取部落格園網站首頁前10頁中所有文章標題帶有
Python關鍵字(不區分大小寫)的文章,並把文章連結和文章標題存入
硬碟,要求如下:
1 使用正則表示式匹配出需要的資料,然後對資料進行解析
2 程式中很明顯有多個任務,這多個任務必須是非同步呼叫
3 任務的返回值要及時處理,不能等所有任務都執行完再統一處理
4 提示資訊:可以使用生產者消費者模型來處理
5 儘可能提升程式的執行效率
"""

# 基本思路與實現方案
import re
import time
import requests

t1 = time.time()

title_list = []
url = 'https://www.cnblogs.com/'
for i in range(1, 11):
    html = requests.post(url=url, data={"PageIndex": i}).text
    res = re.findall('<h3>.*?ython.*?</h3>', html)
    for j in res:
        title_list.append(j)

print(time.time() - t1)

# 非同步思路與優化處理
import re
import requests
from concurrent.futures import ThreadPoolExecutor
import time


def catch(page):
    title_list = []
    url = 'https://www.cnblogs.com/'
    html = requests.post(url=url, data={"PageIndex": page}).text
    res = re.findall('<h3>.*?ython.*?</h3>', html)
    for j in res:
        title_list.append(j)

    return title_list


def analyze(obj):
    data = obj.result()
    if data:
        for j in data:
            res = j.split("=")
            link = res[2][1:-8]
            title = res[3][9:-9]
            with open('data.txt', mode='a', encoding='utf-8') as f:
                f.write('%s|%s\n' % (title, link))


if __name__ == '__main__':
    t1 = time.time()
    tp = ThreadPoolExecutor(10)
    for i in range(1, 11):
        tp.submit(catch, i).add_done_callback(analyze)
    print(time.time() - t1)