gpt4 book ai didi

javascript - 使用 PostBack 数据爬取页面 javascript Python Scrapy

转载 作者:数据小太阳 更新时间:2023-10-29 05:46:33 25 4
gpt4 key购买 nike

我正在通过 Scrapy 使用 ASP.NET 编程爬取一些目录。

要抓取的页面是这样编码的:

javascript:__doPostBack('ctl00$MainContent$List','Page$X')

其中 X 是 1 到 180 之间的整数。MainContent 参数始终相同。我不知道如何爬进这些。我很想在 SLE 规则中添加一些像 allow=('Page$')attrs='__doPostBack' 这样简单的东西,但我想我必须为了从 javascript“链接”中提取信息,需要一些技巧。

如果更容易从 javascript 代码中“揭开”每个绝对链接并将它们保存到 csv,然后使用该 csv 将请求加载到新的抓取器中,那也没关系。

最佳答案

这种分页并不像看起来那么微不足道。解决它是一个有趣的挑战。关于下面提供的解决方案,有几个重要说明:

  • 这里的想法是在 Request.meta dictionary 中的当前页面逐页跟随分页。
  • 使用regular BaseSpider因为分页中涉及一些逻辑
  • 提供伪装成真实浏览器的headers很重要
  • 产生FormRequest很重要s withdont_filter=True 因为我们基本上是向相同的 URL 但使用不同的参数发出 POST 请求

代码:

import re

from scrapy.http import FormRequest
from scrapy.spider import BaseSpider


HEADERS = {
'X-MicrosoftAjax': 'Delta=true',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36'
}
URL = 'http://exitrealty.com/agent_list.aspx?firstName=&lastName=&country=USA&state=NY'


class ExitRealtySpider(BaseSpider):
name = "exit_realty"

allowed_domains = ["exitrealty.com"]
start_urls = [URL]

def parse(self, response):
# submit a form (first page)
self.data = {}
for form_input in response.css('form#aspnetForm input'):
name = form_input.xpath('@name').extract()[0]
try:
value = form_input.xpath('@value').extract()[0]
except IndexError:
value = ""
self.data[name] = value

self.data['ctl00$MainContent$ScriptManager1'] = 'ctl00$MainContent$UpdatePanel1|ctl00$MainContent$agentList'
self.data['__EVENTTARGET'] = 'ctl00$MainContent$List'
self.data['__EVENTARGUMENT'] = 'Page$1'

return FormRequest(url=URL,
method='POST',
callback=self.parse_page,
formdata=self.data,
meta={'page': 1},
dont_filter=True,
headers=HEADERS)

def parse_page(self, response):
current_page = response.meta['page'] + 1

# parse agents (TODO: yield items instead of printing)
for agent in response.xpath('//a[@class="regtext"]/text()'):
print agent.extract()
print "------"

# request the next page
data = {
'__EVENTARGUMENT': 'Page$%d' % current_page,
'__EVENTVALIDATION': re.search(r"__EVENTVALIDATION\|(.*?)\|", response.body, re.MULTILINE).group(1),
'__VIEWSTATE': re.search(r"__VIEWSTATE\|(.*?)\|", response.body, re.MULTILINE).group(1),
'__ASYNCPOST': 'true',
'__EVENTTARGET': 'ctl00$MainContent$agentList',
'ctl00$MainContent$ScriptManager1': 'ctl00$MainContent$UpdatePanel1|ctl00$MainContent$agentList',
'': ''
}

return FormRequest(url=URL,
method='POST',
formdata=data,
callback=self.parse_page,
meta={'page': current_page},
dont_filter=True,
headers=HEADERS)

关于javascript - 使用 PostBack 数据爬取页面 javascript Python Scrapy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28974838/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com