首頁 > 軟體

Python用requests模組實現動態網頁爬蟲

2022-02-11 16:01:36

前言

Python爬蟲實戰,requests模組,Python實現動態網頁爬蟲

讓我們愉快地開始吧~

開發工具

Python版本: 3.6.4

相關模組:

urllib模組;

random模組;

requests模組;

traceback模組;

以及一些Python自帶的模組。

環境搭建

安裝Python並新增到環境變數,pip安裝需要的相關模組即可。

那我們就開啟爬蟲的正確姿勢吧,先用解析介面的方法來寫爬蟲。

首先,找到真實請求。右鍵檢查,點選Network,選中XHR,重新整理網頁,選擇Name列表中的jsp檔案。沒錯,就這麼簡單,真實請求就藏在裡面。

我們再仔細看看這個jsp,這簡直是個寶啊。有真實請求url,有請求方法post,有Headers,還有Form Data,而From Data表示給url傳遞的引數,通過改變引數,咱們就可以獲得資料!為了安全,給自個Cookie打了個馬賽克

我們嘗試點選翻頁,發現只有pagesnum引數會變化。

1 from urllib.parse import urlencode
2 import csv
3 import random
4 import requests
5 import traceback
6 from time import sleep
7 from lxml import etree    #lxml為第三方網頁解析庫,強大且速度快

1 base_url = 'http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search_content.jsp?'  #這裡要換成對應Ajax請求中的連結
2
3 headers = {
4    'Connection': 'keep-alive',
5    'Accept': '*/*',
6    'X-Requested-With': 'XMLHttpRequest',
7    'User-Agent': '你的User-Agent',
8    'Origin': 'http://www.hshfy.sh.cn',
9    'Referer': 'http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search.jsp?zd=splc',
10    'Accept-Language': 'zh-CN,zh;q=0.9',
11    'Content-Type': 'application/x-www-form-urlencoded',
12    'Cookie': '你的Cookie'
13 }

構建get_page函數,自變數為page,也就是頁數。以字典型別建立表單data,用post方式去請求網頁資料。這裡要注意要對返回的資料解碼,編碼為’gbk’,否則返回的資料會亂碼!

1def get_page(page):
2    n = 3
3    while True:
4        try:
5            sleep(random.uniform(1, 2))  # 隨機出現1-2之間的數,包含小數
6            data = {
7                'yzm': 'yxAH',
8                'ft':'',
9                'ktrqks': '2020-05-22',
10                'ktrqjs': '2020-06-22',
11                'spc':'',
12                'yg':'',
13                'bg':'',
14                'ah':'',
15                'pagesnum': page
16            }
17            url = base_url + urlencode(data)
18            print(url)
19            try:
20                response = requests.request("POST",url, headers = headers)
21                #print(response)
22                if response.status_code == 200:
23                    re = response.content.decode('gbk')
24                    # print(re)
25                    return re  # 解析內容
26            except requests.ConnectionError as e:
27                print('Error', e.args)  # 輸出異常資訊
28        except (TimeoutError, Exception):
29            n -= 1
30            if n == 0:
31                print('請求3次均失敗,放棄此url請求,檢查請求條件')
32                return
33            else:
34                print('請求失敗,重新請求')
35                continue

構建parse_page函數,對返回的網頁資料進行解析,用Xpath提取所有欄位內容,儲存為csv格式。

 1def parse_page(html):
2    try:
3        parse = etree.HTML(html)  # 解析網頁
4        items = parse.xpath('//*[@id="report"]/tbody/tr')
5        for item in items[1:]:
6            item = {
7                'a': ''.join(item.xpath('./td[1]/font/text()')).strip(),
8                'b': ''.join(item.xpath('./td[2]/font/text()')).strip(),
9                'c': ''.join(item.xpath('./td[3]/text()')).strip(),
10                'd': ''.join(item.xpath('./td[4]/text()')).strip(),
11                'e': ''.join(item.xpath('./td[5]/text()')).strip(),
12                'f': ''.join(item.xpath('./td[6]/div/text()')).strip(),
13                'g': ''.join(item.xpath('./td[7]/div/text()')).strip(),
14                'h': ''.join(item.xpath('./td[8]/text()')).strip(),
15                'i': ''.join(item.xpath('./td[9]/text()')).strip()
16            }
17            #print(item)
18            try:
19                with open('./law.csv', 'a', encoding='utf_8_sig', newline='') as fp:
20                    # 'a'為追加模式(新增)
21                    # utf_8_sig格式匯出csv不亂碼
22                    fieldnames = ['a', 'b', 'c', 'd', 'e','f','g','h','i']
23                    writer = csv.DictWriter(fp,fieldnames)
24                    writer.writerow(item)
25            except Exception:
26                print(traceback.print_exc())  #代替print e 來輸出詳細的異常資訊
27    except Exception:
28        print(traceback.print_exc())

遍歷一下頁數,呼叫一下函數

1    for page in range(1,5):  #這裡設定想要爬取的頁數
2        html = get_page(page)
3        #print(html)
4        print("第" + str(page) + "頁提取完成")

效果:

總結

到此這篇關於Python用requests模組實現動態網頁爬蟲的文章就介紹到這了,更多相關Python requests內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com