【问题标题】:Scrapy crawler response url vs request urlScrapy爬虫响应网址与请求网址
【发布时间】:2020-04-22 15:34:51
【问题描述】:

我对编程和 python 世界很陌生。我目前正在探索 python 中的 scapy 框架。我构建了一个从不同页面上的不同广告中提取信息的蜘蛛。当我导航到下一页时,我遇到了无法解决的问题。

响应 url 与请求 url 不同,因此它改变了我的搜索查询。附上一个可以看出这种差异的scrapy shell的例子。有人可以向我解释为什么会发生这种情况以及如何预防吗?

(scrapyvirtualenv) PS C:\Users\X\Desktop\Python1\scrapy\webcrawler> scrapy shell "https://www.marktplaats.nl/l/huis-en-inrichting/kasten-dressoirs/p/2/#q:jaren+60" 
The JSON file does not exist
The CSV file does not exist
2020-04-19 12:02:12 [scrapy.utils.log] INFO: Scrapy 2.0.1 started (bot: WebCrawler)
2020-04-19 12:02:12 [scrapy.utils.log] INFO: Versions: lxml 4.5.0.0, libxml2 2.9.5, cssselect 1.1.0, parsel 1.5.2, w3lib 1.21.0, Twisted 20.3.0, Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)], pyOpenSSL 19.1.0 (OpenSSL 1.1.1f  31 Mar 2020), cryptography 2.9, Platform Windows-10-10.0.18362-SP0
2020-04-19 12:02:12 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor
2020-04-19 12:02:12 [scrapy.crawler] INFO: Overridden settings:
{'BOT_NAME': 'WebCrawler',
 'DUPEFILTER_CLASS': 'scrapy.dupefilters.BaseDupeFilter',
 'LOGSTATS_INTERVAL': 0,
 'NEWSPIDER_MODULE': 'WebCrawler.spiders',
 'ROBOTSTXT_OBEY': True,
 'SPIDER_MODULES': ['WebCrawler.spiders']}
2020-04-19 12:02:12 [scrapy.extensions.telnet] INFO: Telnet Password: something
2020-04-19 12:02:12 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole']
2020-04-19 12:02:12 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2020-04-19 12:02:12 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2020-04-19 12:02:12 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2020-04-19 12:02:12 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2020-04-19 12:02:12 [scrapy.core.engine] INFO: Spider opened
2020-04-19 12:02:12 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.marktplaats.nl/robots.txt> (referer: None)
2020-04-19 12:02:12 [protego] DEBUG: Rule at line 2 without any user agent to enforce it on.
2020-04-19 12:02:13 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.marktplaats.nl/l/huis-en-inrichting/kasten-dressoirs/p/2/#q:jaren+60> (referer: None)
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x00000255C48D9100>
[s]   item       {}
[s]   request    <GET https://www.marktplaats.nl/l/huis-en-inrichting/kasten-dressoirs/p/2/#q:jaren+60>
[s]   response   <200 https://www.marktplaats.nl/l/huis-en-inrichting/kasten-dressoirs/p/2/>
[s]   settings   <scrapy.settings.Settings object at 0x00000255C48D6E20>
[s]   spider     <MarktplaatsSpider 'marktplaats' at 0x255c4c29f40>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser

我尝试使用 meta={'dont_redirect': True} 调整 yield 函数,但这并没有达到预期的结果。

yield scrapy.Request(next_page_url, meta={'dont_redirect': True}, callback=self.parse)

【问题讨论】:

  • 如果您的意思是#q:jaren+60 字符串的区别,那是因为# 之后的所有内容都不会发送到服务器(更多信息here)。

标签: python-3.x scrapy


【解决方案1】:

非常感谢你们!

在阅读您的建议时,我发现:https://www.youtube.com/watch?v=EelmnSzykyI 最终将我引向了此https://ianlondon.github.io/blog/web-scraping-discovering-hidden-apis/,这帮助我找到了解决问题的方法。

【讨论】:

    【解决方案2】:

    您的 URl 中的 # 只是放在那里供您的浏览器(chrome ...)使用以直接移动到该 CSS,您可以让 scrapy 为您处理或不为您处理。

    一个很好的文档是Ajax Scrapy

    我建议删除它并正常请求页面

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多