Python用requests模塊實現動態網頁爬蟲
前言
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內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳解如何使用Python網絡爬蟲獲取招聘信息
- python使用xpath獲取頁面元素的使用
- Python爬蟲,獲取,解析,存儲詳解
- 詳解Python requests模塊
- Python數據提取-lxml模塊