咸陽工商招標信息抓取
最近有個搞爬蟲的朋友讓我幫他看下咸陽工商招標信息是怎麼抓取的,一些參數他無法獲取。經過分析之後,發現搞爬蟲,思路是真的重要。
分析網站
網站url: http://www.xyjsgc.com/website/main/Channel.aspx?fcol=122002
通過打開url,獲取請求信息:
可以看到,每次的請求都帶上了多個參數,而且看起來毫無規律(我朋友就卡在這裏),每次到了這個時候,就更不能着急,這些參數的存在,無非就幾種情況:
1、頁面自帶
2、點擊後通過調用前端js代碼生成
點擊下一頁發現,參數是一直變化的,對比前一頁的源碼,幸運地,這個是在頁面代碼中直接提供:
就這樣,我用幾分鐘的時間,完成了他幾天沒有搞出來的東西😂。
代碼實現
找到了規律,一切就好辦了,通過構造參數,完成模擬請求,就完事了:
import requests
from bs4 import BeautifulSoup
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
}
def get_detail_data(soup):
"""
獲取詳細數據
:param soup:
:return:
"""
tr_lists = soup.find_all('tr', {'class': 'nslist'})
xy_main_url = 'http://www.xyjsgc.com/website/main/'
for tr in tr_lists:
title = tr.find('a')['title']
detail_url = '{}{}'.format(xy_main_url, tr.find('a')['href'])
print(title)
def xy_business_circles(datas={}):
"""
抓取咸陽的招標信息
:param datas:請求的參數
:return:
"""
url = 'http://www.xyjsgc.com/website/main/Channel.aspx?fcol=122002'
# r = requests.get(url, headers=headers) if datas else requests.post(url, datas=datas, headers=headers)
r = requests.post(url, data=datas, headers=headers)
soup = BeautifulSoup(r.text, 'html.parser')
get_detail_data(soup)
if '下一頁' in r.text:
datas ={
'__EVENTTARGET': 'Pager1$lb_Next',
'__EVENTARGUMENT': '',
'__LASTFOCUS': '',
'__VIEWSTATEGENERATOR': '1B79AC81',
'cl1$KeyWord1': '',
'Pager1$NavPage': ''
}
datas['__EVENTVALIDATION'] = soup.find('input', {'name': '__EVENTVALIDATION'})['value']
datas['__VIEWSTATE'] = soup.find('input', {'name': '__VIEWSTATE'})['value']
print(datas)
xy_business_circles(datas)
if __name__ == '__main__':
data_list = []
xy_business_circles()
結語
爬蟲更靠思路,找到解決問題的思路,比敲更多的代碼更有效,不要一味蠻幹,得要有點巧勁。附上代碼地址。