最近有个搞爬虫的朋友让我帮他看下咸阳工商招标信息是怎么抓取的,一些参数他无法获取。经过分析之后,发现搞爬虫,思路是真的重要。
网站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()
爬虫更靠思路,找到解决问题的思路,比敲更多的代码更有效,不要一味蛮干,得要有点巧劲。附上代码地址。