Python Scrapy-从URL刮下来的不是在start_urls中设置的

时间:2019-04-21 15:19:01

标签: python python-3.x web-scraping scrapy

我是新手,使用scrapy,我对所抓取的网址有疑问。

我正在尝试抓取一个网站,您访问的每个页面都将重定向到首页,当您单击横幅广告时,您可以访问其他页面。我尝试使用

meta={'dont_redirect': True, 'handle_httpstatus_list': [301, 302]

以避免重定向,但从url抓取仍然错误。因此,我认为问题出在Cookie上,要对其进行测试,我已经将Cookie硬编码为与进入网站时的浏览器相同,现在它不重定向了,我什至无需在其中添加“ dont_redirect”元,但是当我看到调试器时,它仍在抓取首页。

现在的代码是这样的:


import scrapy


class MatchOpeningSpider(scrapy.Spider):
    name = 'bet_365_match_opening'
    start_urls = [
        'https://www.bet365.com/#/AC/B1/C1/D13/E38078994/F2/'
    ]

    def start_requests(self):
        for url in self.start_urls:
            yield scrapy.Request(url, cookies={
                'pstk': '04761A56B7A54D9BB3948A093FB9F440000003',
                'rmbs': 3,
                'aps03': 'lng=22&tzi=34&oty=2&ct=28&cg=1&cst=0&hd=N&cf=N',
                'session': 'processform=0&fms=1'
            })

    def parse(self, response):
        games = response.css('div.sl-CouponParticipantWithBookCloses_Name').extract()
        yield {'games': games}

您可以看到Crawled url正确的调试信息,但Scraped from是主页

2019-04-21 12:02:37 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.bet365.com/#/AC/B1/C1/D13/E38078994/F2/> (referer: None)
2019-04-21 12:02:37 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.bet365.com/>

我做错了什么? 感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

在您的 start_url 中,中间有一个fragment identifier(尖号:#),浏览器将不会继续浏览它

这意味着您需要的数据可能不在 start_url 的HTTP响应中,而是在此主文档请求并由客户端呈现之后通过其他一些Ajax调用

我的建议:

  1. 使用浏览器的开发工具或Scrapy shell甚至CURL工具来确保所需的内容在 start_url 中存在 em>首先。否则您报错了URL

  2. 使http标头和cookie与在实际浏览器中的用法完全相同。 Scrapy为您处理3xx重定向和cookie更改,但是您需要在您的Spider程序中找到并代表实际的访问路径

  3. 如果数据是从客户端渲染的,并且您对此感到厌倦,请尝试使用基于Selenium的Spider,使用带有JS引擎的浏览器来解决这些问题