【问题标题】:scraping content of ASP.NET based website using scrapy使用 scrapy 抓取基于 ASP.NET 的网站的内容
【发布时间】:2017-05-16 20:08:41
【问题描述】:

我一直试图从这个网站http://www.golf.org.au 上抓取一些列表,它是一个基于 ASP.NET 的网站,我做了一些研究,看来我必须在 POST 请求中传递一些值才能使网站将数据提取到表我做到了,但我仍然没有任何想法我错过了什么?

这是我的代码:

# -*- coding: utf-8 -*-
import scrapy


class GolfscraperSpider(scrapy.Spider):
    name = "golfscraper"
    allowed_domains = ["golf.org.au","www.golf.org.au"]
    ids = ['3012801330', '3012801331', '3012801332', '3012801333']
    start_urls = []
    for id in ids:
        start_urls.append('http://www.golf.org.au/handicap/%s' %id)

    def parse(self, response):
        scrapy.FormRequest('http://www.golf.org.au/default.aspx?
s=handicap',
                           formdata={
                               '__VIEWSTATE': 
response.css('input#__VIEWSTATE::attr(value)').extract_first(),
                               'ctl11$ddlHistoryInMonths':'48',
                               '__EVENTTARGET': 
'ctl11$ddlHistoryInMonths',
                               '__EVENTVALIDATION' : 
response.css('input#__EVENTVALIDATION::attr(value)').extract_first(),
                               'gaHandicap' : '6.5',
                               'golflink_No' : '2012003003',
                               '__VIEWSTATEGENERATOR' : 'CA0B0334',
                           },
                           callback=self.parse_details)

    def parse_details(self,response):
        for name in response.css('div.rnd-course::text').extract():
            yield {'name' : name}

【问题讨论】:

    标签: asp.net web-scraping scrapy


    【解决方案1】:

    是的,ASP 页面很难抓取。很可能缺少一些小参数。

    解决办法:

    1. 不要通过scrapy.FormRequest(...) 创建请求,而是使用scrapy.FormRequest.from_response() 方法(参见下面的代码示例)。这将捕获大部分甚至全部隐藏的表单数据,并使用它来预填充 FormRequest 的数据。

    2. 您似乎忘记返回请求了,也许这也是另一个潜在的问题......

    3. 据我所知,__VIEWSTATEGENERATOR 每次都会更改,并且必须从页面中提取

    4. 如果这不起作用,请使用 Firebug 插件或 Chrome 的开发人员工具启动 Firefox 浏览器,在浏览器中执行请求,然后根据请求中的相同数据检查完整的请求标头和正文数据。会有一些不同。

    包含我所有建议的示例代码:

    def parse(self, response):
        req = scrapy.FormRequest.from_response(response,
                           formdata={
            '__VIEWSTATE': response.css('input#__VIEWSTATE::attr(value)').extract_first(),
            'ctl11$ddlHistoryInMonths':'48',
            '__EVENTTARGET': 'ctl11$ddlHistoryInMonths',
            '__EVENTVALIDATION' : response.css('input#__EVENTVALIDATION::attr(value)').extract_first(),
            'gaHandicap' : '6.5',
            'golflink_No' : '2012003003',
            '__VIEWSTATEGENERATOR' : 'CA0B0334',
                           },
                           callback=self.parse_details)
        log.info(req.headers)
        log.info(req.body)
        return req
    

    【讨论】:

    • 非常感谢我回复了请求,一切正常感谢您指出我的愚蠢错误
    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2013-05-09
    • 2020-10-12
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多