使用Scrapy和Selenium抓取搜索结果

时间:2019-12-09 21:53:22

标签: python selenium web-scraping scrapy

这可能是一个很长的路,但是人们一直对我过去发布的问题非常有帮助,因此我将尝试。如果有人可以帮助我,那就太好了...

在中文在线报纸-pages like this

上搜索关键字后,我正试图使用​​Scrapy获取搜索结果(链接)。

当我在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之后。

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

1 个答案:

答案 0 :(得分:0)

在检查工具中,打开“网络”标签并查看请求,您将发现数据来自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']
            }