使用Scrapy / Splash刮刮谷歌图像 - 重定向

时间:2017-05-17 09:49:18

标签: python scrapy screen-scraping splash

我正在尝试使用Google图像搜索反向图像搜索的结果。

我的起始网址为https://www.google.com/searchbyimage?image_url=DIRECT_IMAGE_URL,可在浏览器中按预期工作。

然而,当我尝试通过Scrapy抓取它时,请求被重定向3次,如图所示;

Image reverse search redirects

结果网页看起来像

Google search result

而不是结果页面。这是我的Scrapy settings.py

    SPLASH_URL = 'http://splash:8050'
    DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
     SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
      }
     DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
      HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
      REDIRECT_MAX_TIMES = 2
      HTTPCACHE_ENABLED = True 

我考虑过了;

  1. 缺少Javascript - 所以我使用Splash来呈现页面
  2. Cookies - 我认为它有效吗?
  3. 设置最大重定向 - 无法正常工作
  4. 这是我对SplashRequest的调用;

    yield SplashRequest(url, self.parse, meta={
            'cookiejar': i,
            'wait': 0.5,
            'splash': {
              'args': {
                  'html': 1,
                  'png': 1,
              },
              'splash_headers': {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11'
              }       # optional; a dict with headers sent to Splash
          }
    

    知道造成3次重定向的原因是什么吗?第一次重定向对于结果是必要的,但是第二次和第三次重定向不是,并且给我错误的页面。

1 个答案:

答案 0 :(得分:3)

我已经弄明白了!我的错误发生在User-Agent中。我以为我正在设置User-Agent,但实际上我设置了发送到Splash的请求的标头,而不是实际发送到我想要抓取的页面的请求。< / p>

为了让这个工作,我改变了

yield SplashRequest(url, self.parse, meta={
            'cookiejar': i,
            'wait': 0.5,
            'splash': {
              'args': {
                  'html': 1,
                  'png': 1,
              },
              'splash_headers': {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11'
              }       # optional; a dict with headers sent to Splash
          }
        })

yield SplashRequest(url, self.parse, meta={
            'cookiejar': i,
            'wait': 0.5,
            'splash': {
              'args': {
                  'html': 1,
                  'png': 1,
              }
          },
        }, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'})