如何使用 scrapy 抓取 asp 网络表单 link
how to crawl asp webform link using scrapy
我想抓取一个网络表单网站,但 link 不是常规的 href,它们如下所示:
我想让 scrapy 得到 link 然后去那里
< a id="ctl00_ContentPlaceHolder1_DtGrdAttraf_ctl06_LnkBtnDisplayHadith" title="some title" class="Txt" onmouseover="changeStyle(this, 'lnk')" onmouseout="changeStyle(这个,'Txt TxtSmall')" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$ContentPlaceHolder1$DtGrdAttraf$ctl06$LnkBtnDisplayHadith", "", false, "" , "http://www.sonnaonline.com/DisplayResults.aspx?Menu=1&ParentID=13&Flag=dbID&Selid=8483", false, true))">link 文本 a>
Asp.net 是一个表单驱动的框架。所以,您必须填写表格并手动 post 它才能到达页面导向?
怎么做?
首先,你可以看这里,我的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
用逗号分割,填入适当的输入元素,post用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.
中提琴!您可以进入页面,响应可以作为回调函数中的参数获得。
您可以在上面的 link 中看到一些示例。
我想抓取一个网络表单网站,但 link 不是常规的 href,它们如下所示: 我想让 scrapy 得到 link 然后去那里
< a id="ctl00_ContentPlaceHolder1_DtGrdAttraf_ctl06_LnkBtnDisplayHadith" title="some title" class="Txt" onmouseover="changeStyle(this, 'lnk')" onmouseout="changeStyle(这个,'Txt TxtSmall')" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$ContentPlaceHolder1$DtGrdAttraf$ctl06$LnkBtnDisplayHadith", "", false, "" , "http://www.sonnaonline.com/DisplayResults.aspx?Menu=1&ParentID=13&Flag=dbID&Selid=8483", false, true))">link 文本 a>
Asp.net 是一个表单驱动的框架。所以,您必须填写表格并手动 post 它才能到达页面导向?
怎么做?
首先,你可以看这里,我的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
用逗号分割,填入适当的输入元素,post用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.
中提琴!您可以进入页面,响应可以作为回调函数中的参数获得。
您可以在上面的 link 中看到一些示例。