一尘不染

selenium与scrapy的动态页面

scrapy

我正在尝试使用scrapy从网页中抓取产品信息。我的待抓取网页如下所示:

  • 从包含10个产品的product_list页面开始
  • 单击“下一步”按钮将加载接下来的10个产品(两个页面之间的网址不变)
  • 我使用LinkExtractor跟随每个产品链接进入产品页面,并获取我需要的所有信息
    我试图复制下一个按钮的ajax调用,但是无法正常工作,因此我尝试使用selenium。我可以在单独的脚本中运行selenium的webdriver,但是我不知道如何与scrapy集成。selenium部分应该放在哪里我的刮spider蜘蛛里?

我的蜘蛛非常标准,如下所示:

class ProductSpider(CrawlSpider):
    name = "product_spider"
    allowed_domains = ['example.com']
    start_urls = ['http://example.com/shanghai']
    rules = [
        Rule(SgmlLinkExtractor(restrict_xpaths='//div[@id="productList"]//dl[@class="t2"]//dt'), callback='parse_product'),
        ]

    def parse_product(self, response):
        self.log("parsing product %s" %response.url, level=INFO)
        hxs = HtmlXPathSelector(response)
        # actual data follows

任何想法表示赞赏。谢谢!


阅读 980

收藏
2020-04-08

共1个答案

一尘不染

这实际上取决于你需要如何刮取网站以及你希望如何以及要获取什么数据。

这是一个示例,你可以使用Scrapy+ 跟踪eBay上的分页Selenium

import scrapy
from selenium import webdriver

class ProductSpider(scrapy.Spider):
    name = "product_spider"
    allowed_domains = ['ebay.com']
    start_urls = ['http://www.ebay.com/sch/i.html?_odkw=books&_osacat=0&_trksid=p2045573.m570.l1313.TR0.TRC0.Xpython&_nkw=python&_sacat=0&_from=R40']

    def __init__(self):
        self.driver = webdriver.Firefox()

    def parse(self, response):
        self.driver.get(response.url)

        while True:
            next = self.driver.find_element_by_xpath('//td[@class="pagn-next"]/a')

            try:
                next.click()

                # get the data and write it to scrapy items
            except:
                break

        self.driver.close()

除了必须与结合使用之外Selenium,还有另一种选择Scrapy

2020-04-08