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

前言

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

讓我們愉快地開始吧~

開發工具

Python版本: 3.6.4

相關模塊:

urllib模塊;

random模塊;

requests模塊;

traceback模塊;

以及一些Python自帶的模塊。

環境搭建

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

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

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

1.gif

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

image.png

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

3.png

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) + "頁提取完成")

效果:

4.gif

總結

到此這篇關於Python用requests模塊實現動態網頁爬蟲的文章就介紹到這瞭,更多相關Python requests內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: