【问题标题】:Scraping search results with Scrapy and Selenium使用 Scrapy 和 Selenium 抓取搜索结果
【发布时间】:2020-04-03 01:10:40
【问题描述】:

这可能是一个很长的尝试,但人们一直对我过去发布的问题非常有帮助,所以我会尝试。如果有人可以帮助我,那就太棒了……

我正在尝试使用 Scrapy 在中国在线报纸上搜索关键字后获取搜索结果(链接) - pages like this

当我在 Chrome 中检查页面的 html 时,文章的链接似乎在那里。但是当我尝试使用 Scrapy 蜘蛛抓取它时,html 更加基本,并且我想要的链接不会出现。我认为这可能是因为使用 JavaScript 将结果绘制到页面?我尝试将 Scrapy 与 'scrapy-selenium' 结合使用来解决这个问题,但它仍然无法正常工作。我听说 Splash 可能会起作用,但这似乎设置起来很复杂。

这是我的 Scrapy 蜘蛛的代码:

import scrapy
from scrapy_selenium import SeleniumRequest


class QuotesSpider(scrapy.Spider):
    name = "XH"

    def start_requests(self):
        urls = [
            'http://so.news.cn/#search/0/%E4%B8%80%E5%B8%A6%E4%B8%80%E8%B7%AF/1/'
        ]
        for url in urls:
            yield SeleniumRequest(url=url, wait_time=90, callback=self.parse)

    def parse(self, response):
        print(response.request.meta['driver'].title)
        page = response.url.split("/")[-2]
        filename = 'XH-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

如果有帮助,我也可以发布任何其他 Scrapy 文件。我还修改了settings.py - 关注these instructions

任何帮助将不胜感激。我完全被这个困住了!

【问题讨论】:

  • 请仔细检查您粘贴的代码。我认为你的复制/粘贴很糟糕。
  • 感谢您的回复。我已经更正了代码的输入。
  • @Gallaecio - 感谢您的评论。我已经通读了这个,它似乎指向使用 Splash(通过 Docker)。这是唯一的方法吗?是否不可能像我一直在尝试做的那样通过 Selenium 来做到这一点......?感谢您的帮助。
  • 您可以使用下载器中间件来覆盖内容提取过程,请参阅this。你可以使用this库来做这样的工作。

标签: python selenium web-scraping scrapy


【解决方案1】:

在检查工具中打开网络选项卡并观察请求,您会发现数据来自this url,因此请使用普通的scrapy.Request() 抓取它。
蜘蛛会是这样的:

import scrapy
import json

class QuotesSpider(scrapy.Spider):
    name = "XH"

    def start_requests(self):
        urls = [
            'http://so.news.cn/getNews?keyword=%E4%B8%80%E5%B8%A6&curPage=1&sortField=0&searchFields=1&lang=cn'
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        json_data = json.loads(response.body.decode('utf-8'))
        for data in json_data['content']['results']:
            yield {
                'url': data['url']
            }

【讨论】:

  • 非常感谢您的回答 - 它运作良好。有什么方法可以自动找到数据来自的 url(所以我不必检查每个页面)?另外,您能否告诉我如何解析该页面的爬网以从中获取链接-它是用Java 编写的吗?再次感谢!
  • 这是我所知道的最好的方法,所以如果你找到更好的方法,请告诉我。我做了一些更新并添加了解析方法,看看吧。
  • 再次感谢您的帮助。对此,我真的非常感激。我把解析方法放进去,然后从终端运行'scrapy crawl XH -o results.json'。但是,生成的“results.json”文件是空白的——有什么想法吗?
  • 我刚刚检查了它,它对我来说很好,想仔细检查你是否遗漏了一些错误,例如你是否更改了 URL?日志看起来还好吗?
  • 我检查了 URL 等,一切似乎都很好。更改上面的代码时,我只是删除了与 Selenium 的连接,将 URL 更改为数据的 URL,然后将 'def parse(self, response):' 下面的代码替换为您发送给我进行解析的代码。有没有办法可以把你让它工作的蜘蛛的完整代码发给我?谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 2011-12-06
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
相关资源
最近更新 更多