【问题标题】:Selenium inside scrapy does not workscrapy里面的硒不起作用
【发布时间】:2016-10-17 16:20:26
【问题描述】:

我有一个scrapy Crawlspider 可以解析链接并返回html 内容就好了。然而,对于 javascript 页面,我让 Selenium 访问“隐藏”内容。问题是,虽然 Selenium 在 scrapy 解析之外工作,但它在 parse_items 函数内部不起作用

from scrapy.spiders import CrawlSpider, Rule, Spider
from scrapy.selector import HtmlXPathSelector
from scrapy.linkextractors import LinkExtractor
from scrapy.linkextractors.sgml import SgmlLinkExtractor
from craigslist_sample.items import CraigslistReviewItem
import scrapy
from selenium import selenium
from selenium import webdriver


class MySpider(CrawlSpider):
    name = "spidername"
    allowed_domains = ["XXXXX"]
    start_urls = ['XXXXX']

    rules = (
        Rule(LinkExtractor(allow = ('reviews\?page')),callback= 'parse_item'),
        Rule(LinkExtractor(allow=('.',),deny = ('reviews\?page',)),follow=True))

    def __init__(self):
        #this page loads 
        CrawlSpider.__init__(self)
        self.selenium = webdriver.Firefox()
        self.selenium.get('XXXXX')
        self.selenium.implicitly_wait(30)


    def parse_item(self, response):
        #this page doesnt
        print response.url
        self.driver.get(response.url)
        self.driver.implicitly_wait(30)

       #...do things

【问题讨论】:

  • 您没有描述究竟是什么不起作用,也没有描述您尝试了什么。我们有点需要知道#...do things 实际做了什么......
  • 注意:请不要像使用'selenium'一样在脚本中使用模块名作为变量名

标签: python python-2.7 selenium selenium-webdriver scrapy


【解决方案1】:

您有一些变量问题。在 init 方法中,您将浏览器实例分配给 self.selenium,然后在方法 parse_item 中,您使用 self.driver 作为浏览器实例。我已经更新了你的脚本。立即尝试。

from scrapy.spiders import CrawlSpider, Rule, Spider
from scrapy.selector import HtmlXPathSelector
from scrapy.linkextractors import LinkExtractor
from scrapy.linkextractors.sgml import SgmlLinkExtractor
from craigslist_sample.items import CraigslistReviewItem
import scrapy
from selenium import selenium
from selenium import webdriver


class MySpider(CrawlSpider):
    name = "spidername"
    allowed_domains = ["XXXXX"]
    start_urls = ['XXXXX']

    rules = (
        Rule(LinkExtractor(allow = ('reviews\?page')),callback= 'parse_item'),
        Rule(LinkExtractor(allow=('.',),deny = ('reviews\?page',)),follow=True))

    def __init__(self):
        #this page loads 
        CrawlSpider.__init__(self)
        self.driver= webdriver.Firefox()
        self.driver.get('XXXXX')
        self.driver.implicitly_wait(30)


    def parse_item(self, response):
        #this page doesnt
        print response.url
        self.driver.get(response.url)
        self.driver.implicitly_wait(30)

       #...do things

【讨论】:

    【解决方案2】:

    太棒了!哈桑的答案和对我正在抓取的网址的更好了解的结合导致了答案(结果是该网站种植了从未加载过的“假”网址)

    【讨论】:

    • 因此,请接受 Hassan 的回答,以表彰他所做的工作。不要发布您自己的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    相关资源
    最近更新 更多