Python用requests模塊實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁爬蟲
前言
Python爬蟲實(shí)戰(zhàn),requests模塊,Python實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁爬蟲
讓我們愉快地開始吧~
開發(fā)工具
Python版本: 3.6.4
相關(guān)模塊:
urllib模塊;
random模塊;
requests模塊;
traceback模塊;
以及一些Python自帶的模塊。
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
那我們就開啟爬蟲的正確姿勢吧,先用解析接口的方法來寫爬蟲。
首先,找到真實(shí)請求。右鍵檢查,點(diǎn)擊Network,選中XHR,刷新網(wǎng)頁,選擇Name列表中的jsp文件。沒錯(cuò),就這么簡單,真實(shí)請求就藏在里面。

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

我們嘗試點(diǎn)擊翻頁,發(fā)現(xiàn)只有pagesnum參數(shù)會(huì)變化。

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為第三方網(wǎng)頁解析庫,強(qiáng)大且速度快
1 base_url = 'http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search_content.jsp?' #這里要換成對應(yīng)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 }
構(gòu)建get_page函數(shù),自變量為page,也就是頁數(shù)。以字典類型創(chuàng)建表單data,用post方式去請求網(wǎng)頁數(shù)據(jù)。這里要注意要對返回的數(shù)據(jù)解碼,編碼為’gbk’,否則返回的數(shù)據(jù)會(huì)亂碼!
1def get_page(page):
2 n = 3
3 while True:
4 try:
5 sleep(random.uniform(1, 2)) # 隨機(jī)出現(xiàn)1-2之間的數(shù),包含小數(shù)
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 # 解析內(nèi)容
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
構(gòu)建parse_page函數(shù),對返回的網(wǎng)頁數(shù)據(jù)進(jìn)行解析,用Xpath提取所有字段內(nèi)容,保存為csv格式。
1def parse_page(html):
2 try:
3 parse = etree.HTML(html) # 解析網(wǎng)頁
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格式導(dǎo)出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 來輸出詳細(xì)的異常信息
27 except Exception:
28 print(traceback.print_exc())
遍歷一下頁數(shù),調(diào)用一下函數(shù)
1 for page in range(1,5): #這里設(shè)置想要爬取的頁數(shù)
2 html = get_page(page)
3 #print(html)
4 print("第" + str(page) + "頁提取完成")
效果:

總結(jié)
到此這篇關(guān)于Python用requests模塊實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁爬蟲的文章就介紹到這了,更多相關(guān)Python requests內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息
這篇文章主要介紹了python實(shí)現(xiàn)批量獲取指定文件夾下的所有文件的廠商信息的方法,是非常實(shí)用的技巧,涉及到文件的讀寫與字典的操作等技巧,需要的朋友可以參考下2014-09-09
Python實(shí)例方法與類方法和靜態(tài)方法介紹與區(qū)別分析
在 Python 中,實(shí)例方法(instance method),類方法(class method)與靜態(tài)方法(static method)經(jīng)常容易混淆。本文通過代碼例子來說明它們的區(qū)別2022-10-10
Python基礎(chǔ)語法(Python基礎(chǔ)知識點(diǎn))
這篇文章主要介紹了Python基礎(chǔ)語法(Python基礎(chǔ)知識點(diǎn)),需要的朋友可以參考下2016-02-02
Python編程中time模塊的一些關(guān)鍵用法解析
這篇文章主要介紹了Python編程中time模塊的一些關(guān)鍵用法解析,像mktime和localtime以及gmtime這些常用方法都有講到,需要的朋友可以參考下2016-01-01
python數(shù)據(jù)分析工具之 matplotlib詳解
對于 Python 來說,matplotlib 是最著名的繪圖庫,它主要用于二維繪圖,當(dāng)然也可以進(jìn)行簡單的三維繪圖。這篇文章主要介紹了python數(shù)據(jù)分析工具之 matplotlib的相關(guān)知識,需要的朋友可以參考下2020-04-04
Windows下的Python 3.6.1的下載與安裝圖文詳解(適合32位和64位)
這篇文章主要介紹了Windows下的Python 3.6.1的下載與安裝圖文詳解(適合32位和64位),需要的朋友可以參考下2018-02-02

