求助如何爬虫中遇到内置选择表格
最近学习了小甲鱼的效率革命的爬虫教程,但是在实际爬取网页时候还是遇到一些难以解决的问题想求助各位鱼油!!!在爬取这个网址的时候,网址如下:
http://spf.szfcweb.com/szfcweb/(S(yhdau53nnmqkevmkjhamlddp))/DataSerach/MITShowList.aspx
发现 项目区域 可以选择不同的区域,如工业园区,吴中区等。选择不同的区域,下面表格的内容会对应到相应的区的项目,但网址的url并不会改变。 所以之前学到通过传递url的参数的方式好像也没有用了。想问问这种情况下如何爬取各个区的项目情况呢?请各位鱼油指教!
选不同的项目,它会带不同的参数发给网站。
这些参数来自上一次访问,所以你每次注意收集一下参数,并且带上去就能查询到了。 #!/usr/bin/env python3
# _*_ coding: utf-8 _*_
# Developer: suchocolate
# Date: 2022-03-23 01:16
# File name: pc1.py
# Development tool: PyCharm
import requests
from lxml import etree
def get_args(txt, f=0):
html = etree.HTML(txt)
sta = html.xpath('//input[@id="__VIEWSTATE"]/@value')
gen = html.xpath('//input[@id="__VIEWSTATEGENERATOR"]/@value')
eve = html.xpath('//input[@id="__EVENTVALIDATION"]/@value')
if not f:
return sta, gen, eve
else:
zones = html.xpath('//select[@name="ctl00$MainContent$ddl_RD_CODE"]/option/@value')
return sta, gen, eve, zones
def main():
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',
'Origin': 'http://spf.szfcweb.com',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Host': 'spf.szfcweb.com',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded',
'Upgrade-Insecure-Requests': '1',
'Referer': 'http://spf.szfcweb.com/szfcweb/(S(r2ga2fthdmz1mel1rym2xyat))/DataSerach/MITShowList.aspx'}
url = 'http://spf.szfcweb.com/szfcweb/(S(r2ga2fthdmz1mel1rym2xyat))/DataSerach/MITShowList.aspx'
r = requests.get(url, headers=headers)
sta, gen, eve, zones = get_args(r.text, f=1)
for zone in zones:
data = {'__EVENTTARGET': '',
'__EVENTARGUMENT': '',
'__LASTFOCUS': '',
'__VIEWSTATE': sta,
'__VIEWSTATEGENERATOR': gen,
'__EVENTVALIDATION': eve,
'ctl00$MainContent$txt_Com': '',
'ctl00$MainContent$txt_Pro': '',
'ctl00$MainContent$ddl_RD_CODE': zone,
'ctl00$MainContent$txt_ysz': '',
'ctl00$MainContent$bt_select': '查询',
'ctl00$MainContent$PageGridView1$ctl12$PageList': '0'
}
r = requests.post(url, headers=headers, data=data)
# print(r.status_code)
print(r.text)
sta, gen, eve = get_args(r.text)
if __name__ == '__main__':
main()
suchocolate 发表于 2022-3-23 02:15
感谢解答
页:
[1]