【问题标题】:How to crawl items from a list of links with Scrapy and Selenium如何使用 Scrapy 和 Selenium 从链接列表中抓取项目
【发布时间】:2015-10-12 21:28:36
【问题描述】:

您能帮我更正这个脚本吗:我有一个链接搜索结果列表,我想查看和抓取这些链接中的每一个。
但是这个脚本只点击了第一个链接,然后我的爬虫就停止了。
任何帮助表示赞赏
代码“蜘蛛”:

    from scrapy.contrib.spiders import CrawlSpider
    from scrapy import Selector
    from selenium import webdriver
    from selenium.webdriver.support.select import Select
    from time import sleep
    import selenium.webdriver.support.ui as ui
    from scrapy.xlib.pydispatch import dispatcher
    from scrapy.http import HtmlResponse, TextResponse
    from extraction.items import ProduitItem
    from scrapy import log

    class RunnerSpider(CrawlSpider):
       name = 'products_d'
       allowed_domains = ['amazon.com']
       start_urls = ['http://www.amazon.com']

       def __init__(self):
           self.driver = webdriver.Firefox()
       def parse(self, response):

         sel = Selector(response)
         self.driver.get(response.url)
         recherche = self.driver.find_element_by_xpath('//*[@id="twotabsearchtextbox"]')
         recherche.send_keys("A")
         recherche.submit()

         resultat = self.driver.find_element_by_xpath('//ul[@id="s-results-list-atf"]')
         #Links
         resultas = resultat.find_elements_by_xpath('//li/div[@class="s-item-container"]/div/div/div[2]/div[1]/a')
         links = []
         for lien in resultas:
            l = lien.get_attribute('href')
            links.append(l)
         for result in links:
           item = ProduitItem()
           link = result
           self.driver.get(link)
           item['URL'] = link
           item['Title'] = self.driver.find_element_by_xpath('//h1[@id="aiv-content-title"]').text                     
           yield item

         self.driver.close()

【问题讨论】:

  • 请先用你的实际缩进来修正你的代码(或者这些是你代码的实际缩进吗?),因为 Python 关心这一点,阅读你代码的人也关心这一点。 :)
  • 另外,您似乎仍在使用selenium.webdriver 做事,而不是scrapy。看来您可以使用其中任何一个来完成任务。
  • 好的,我编辑了我的代码@starrify

标签: python selenium hyperlink web-crawler scrapy


【解决方案1】:

所以您的脚本存在一些问题。

1) 您的 parse 函数覆盖了 CrawlSpider 对同一函数的实现。这意味着 CrawlSpider 的默认行为,负责从页面中提取链接以继续抓取,不会被调用。使用 CrawlSpider 时不建议这样做。详情请看这里:

http://doc.scrapy.org/en/latest/topics/spiders.html

2) 您自己不会产生任何后续 URL。你只产出物品。如果你想让 Scrapy 继续处理 URL,你必须在你的项目旁边产生某种形式的 Request 对象。

3) 你在解析函数结束时杀死了 Selenium 的驱动程序。无论如何,这可能会导致它在后续电话中失败。没有必要这样做。

4) 您正在同时使用 Selenium 和 Scrapy 的 URL 抓取。这不一定是错误的,但请记住,它可能会导致一些不稳定的行为。

5) 你的脚本缩进肯定是关闭的,这使得你很难查看你的代码。

【讨论】:

  • 好的,但是您仍然没有产生任何 Request 对象。将您的解析函数重命名为其他名称并将其分配为默认请求回调,或者自己生成请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多