【发布时间】:2021-08-07 08:15:39
【问题描述】:
我想抓取一个网络表单站点,但链接不是常规的 href,它们如下所示: 我想让scrapy得到那个链接并去那里
http://www.sonnaonline.com/DisplayResults.aspx?Menu=1&ParentID=13&Flag=dbID&Selid=8483", false, true))">链接文本
【问题讨论】:
标签: scrapy webforms web-crawler
我想抓取一个网络表单站点,但链接不是常规的 href,它们如下所示: 我想让scrapy得到那个链接并去那里
http://www.sonnaonline.com/DisplayResults.aspx?Menu=1&ParentID=13&Flag=dbID&Selid=8483", false, true))">链接文本
【问题讨论】:
标签: scrapy webforms web-crawler
Asp.net 是一个表单驱动的框架。那么,您必须填写表格并手动发布才能访问页面指示吗?
怎么做?
首先,你可以看看这里,我的scrapy代码。 https://github.com/Timezone-design/python-scrapy-asp-net/blob/master/scrapy_spider/spiders/burzarada_spider.py
您应该首先找出 WebForm_DoPostBackWithOptions() 在页面中的作用。您可以通过 Ctrl+U 从页面源中搜索功能。
你很快就会知道它是做什么的,它在哪里填写这些信息"ctl00$ContentPlaceHolder1$DtGrdAttraf$ctl06$LnkBtnDisplayHadith", "", false, "", "http://www.sonnaonline.com/DisplayResults.aspx?Menu=1&ParentID=13&Flag=dbID&Selid=8483", false, true。
那么,事情就清楚了。
你将a标签的href提取到一个字符串中
response.css('... a ::attr(href)').extract()[0].href # assuming there are many <a>s there
然后用逗号分割字符串"ctl00$ContentPlaceHolder1$DtGrdAttraf$ctl06$LnkBtnDisplayHadith", "", false, "", "http://www.sonnaonline.com/DisplayResults.aspx?Menu=1&ParentID=13&Flag=dbID&Selid=8483", false, true,并将它们填充到适当的输入元素中并通过scrapy.FormRequest发布。
yield scrapy.FormRequest(
'https://burzarada.hzz.hr/Posloprimac_RadnaMjesta.aspx',
formdata = {
'__EVENTTARGET': eventTarget,
'__EVENTARGUMENT': eventArgument,
'__LASTFOCUS': lastFocus,
'__VIEWSTATE': viewState,
'__VIEWSTATEGENERATOR': viewStateGenerator,
'__VIEWSTATEENCRYPTED': viewStateEncrypted,
'ctl00$MainContent$ddlPageSize': pageSize,
'ctl00$MainContent$ddlSort': sort,
},
callback=self.parse_multiple_pages
)
解释:
https://burzarada.hzz.hr/Posloprimac_RadnaMjesta.aspx # url to post the form.
formdata # form data as json. keys are input names.
callback # function to get the response and do next things.
维奥拉!您可以进入页面,响应可以作为回调函数中的参数获取。
您可以在上面的链接中看到一些示例。
【讨论】: