我是新手,使用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/>
我做错了什么? 感谢您的帮助!
答案 0 :(得分:1)
在您的 start_url 中,中间有一个fragment identifier(尖号:#),浏览器将不会继续浏览它
这意味着您需要的数据可能不在 start_url 的HTTP响应中,而是在此主文档请求并由客户端呈现之后通过其他一些Ajax调用
我的建议:
使用浏览器的开发工具或Scrapy shell甚至CURL工具来确保所需的内容在 start_url 中存在 em>首先。否则您报错了URL
使http标头和cookie与在实际浏览器中的用法完全相同。 Scrapy为您处理3xx重定向和cookie更改,但是您需要在您的Spider程序中找到并代表实际的访问路径
如果数据是从客户端渲染的,并且您对此感到厌倦,请尝试使用基于Selenium的Spider,使用带有JS引擎的浏览器来解决这些问题