溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python怎么用requests模塊實現動態網頁爬蟲

發布時間:2022-02-14 09:51:53 來源:億速云 閱讀:298 作者:小新 欄目:開發技術

小編給大家分享一下Python怎么用requests模塊實現動態網頁爬蟲,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

開發工具

Python版本: 3.6.4

相關模塊:

urllib模塊;

random模塊;

requests模塊;

traceback模塊;

以及一些Python自帶的模塊。

環境搭建

安裝Python并添加到環境變量,pip安裝需要的相關模塊即可。

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

首先,找到真實請求。右鍵檢查,點擊Network,選中XHR,刷新網頁,選擇Name列表中的jsp文件。沒錯,就這么簡單,真實請求就藏在里面。

Python怎么用requests模塊實現動態網頁爬蟲

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

Python怎么用requests模塊實現動態網頁爬蟲

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

Python怎么用requests模塊實現動態網頁爬蟲

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模塊實現動態網頁爬蟲”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女