【问题标题】:selenium ajax dynamic pagination base spiderselenium ajax 动态分页基础蜘蛛
【发布时间】:2015-02-15 23:23:52
【问题描述】:

我正在尝试运行我的 Base spider 进行动态分页,但我没有成功爬取。我使用了 selenium ajax 动态分页。我使用的网址是:http://www.demo.com。这是我的代码:

# -*- coding: utf-8 -*-
import scrapy

import re

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor

from scrapy.selector import Selector

from scrapy.spider import BaseSpider

from demo.items import demoItem

from selenium import webdriver

def removeUnicodes(strData):

        if(strData):

            #strData = strData.decode('unicode_escape').encode('ascii','ignore')

            strData = strData.encode('utf-8').strip() 

            strData = re.sub(r'[\n\r\t]',r' ',strData.strip())

            #print 'Output:',strData

        return strData


class demoSpider(scrapy.Spider):
    name = "demourls"

    allowed_domains = ["demo.com"]

    start_urls = ['http://www.demo.com']

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

    def parse(self, response):
        print "*****************************************************"
        self.driver.get(response.url)
        print response.url
        print "______________________________"



        hxs = Selector(response)
        item = sumItem()
        finalurls = []
        while True:
            next = self.driver.find_element_by_xpath('//div[@class="showMoreCars hide"]/a')

            try:
                next.click()
                # get the data and write it to scrapy items
                item['pageurl'] = response.url
                item['title'] =  removeUnicodes(hxs.xpath('.//h1[@class="page-heading"]/text()').extract()[0])
                urls = hxs.xpath('.//a[@id="linkToDetails"]/@href').extract()
                print '**********************************************2***url*****************************************',urls


                for url in urls:
                    print '---------url-------',url
                finalurls.append(url)          

                item['urls'] = finalurls

            except:
                break

        self.driver.close()

        return item

我的 items.py 是

from scrapy.item import Item, Field


class demoItem(Item):



    page = Field()
    urls = Field()

    pageurl = Field()
    title = Field()

当我尝试抓取它并将其转换为 json 时,我的 json 文件为:

[{"pageurl": "http://www.demo.com", "urls": [], "title": "demo"}]

由于动态加载,我无法抓取所有网址。

【问题讨论】:

    标签: python ajax selenium pagination scrapy


    【解决方案1】:

    我希望下面的代码会有所帮助。

    somespider.py

    ​​>
    # -*- coding: utf-8 -*-
    import scrapy
    import re
    from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
    from scrapy.selector import Selector
    from scrapy.spider import BaseSpider
    from demo.items import DemoItem
    from selenium import webdriver
    
    def removeUnicodes(strData):
            if(strData):
                strData = strData.encode('utf-8').strip() 
                strData = re.sub(r'[\n\r\t]',r' ',strData.strip())
            return strData
    
    class demoSpider(scrapy.Spider):
        name = "domainurls"
        allowed_domains = ["domain.com"]
        start_urls = ['http://www.domain.com/used/cars-in-trichy/']
    
        def __init__(self):
            self.driver = webdriver.Remote("http://127.0.0.1:4444/wd/hub", webdriver.DesiredCapabilities.HTMLUNITWITHJS)
    
        def parse(self, response):
            self.driver.get(response.url)
            self.driver.implicitly_wait(5)
            hxs = Selector(response)
            item = DemoItem()
            finalurls = []
            while True:
                next = self.driver.find_element_by_xpath('//div[@class="showMoreCars hide"]/a')
    
                try:
                    next.click()
                    # get the data and write it to scrapy items
                    item['pageurl'] = response.url
                    item['title'] =  removeUnicodes(hxs.xpath('.//h1[@class="page-heading"]/text()').extract()[0])
                    urls = self.driver.find_elements_by_xpath('.//a[@id="linkToDetails"]')
    
                    for url in urls:
                        url = url.get_attribute("href")
                        finalurls.append(removeUnicodes(url))          
    
                    item['urls'] = finalurls
    
                except:
                    break
    
            self.driver.close()
            return item
    

    items.py

    from scrapy.item import Item, Field
    
    class DemoItem(Item):
        page = Field()
        urls = Field()
        pageurl = Field()
        title = Field()
    

    注意: 您需要运行 selenium rc 服务器,因为 HTMLUNITWITHJS 仅使用 Python 与 selenium rc 一起使用。

    运行你的 selenium rc 服务器发出命令:

    java -jar selenium-server-standalone-2.44.0.jar
    

    使用命令运行你的蜘蛛:

    spider crawl domainurls -o someoutput.json
    

    【讨论】:

      【解决方案2】:

      首先,您不需要按 showMoreCars 按钮,因为它会在页面加载后动态按下。相反,等待几秒钟就足够了。

      除了你的scrapy 代码,selenium 能够为你捕获所有的hrefs。这是您需要在 selenium 中执行的操作的示例。

      from selenium import webdriver
      
      driver = webdriver.Firefox()
      
      driver.get("http://www.carwale.com/used/cars-in-trichy/#city=194&kms=0-&year=0-&budget=0-&pn=2")
      driver.implicitly_wait(5)
      urls = driver.find_elements_by_xpath('.//a[@id="linkToDetails"]')
      for url in urls:
          print url.get_attribute("href")
      driver.close()
      

      您只需将它与您的scrapy部分合并。

      输出:

      http://www.carwale.com/used/cars-in-trichy/renault-pulse-s586981/
      http://www.carwale.com/used/cars-in-trichy/marutisuzuki-ritz-2009-2012-s598266/
      http://www.carwale.com/used/cars-in-trichy/mahindrarenault-logan-2007-2009-s607757/
      http://www.carwale.com/used/cars-in-trichy/marutisuzuki-ritz-2009-2012-s589835/
      http://www.carwale.com/used/cars-in-trichy/hyundai-santro-xing-2003-2008-s605866/
      http://www.carwale.com/used/cars-in-trichy/chevrolet-captiva-s599023/
      http://www.carwale.com/used/cars-in-trichy/chevrolet-enjoy-s595824/
      http://www.carwale.com/used/cars-in-trichy/tata-indicav2-s606823/
      http://www.carwale.com/used/cars-in-trichy/tata-indicav2-s606617/
      http://www.carwale.com/used/cars-in-trichy/marutisuzuki-estilo-2009-2014-s592745/
      http://www.carwale.com/used/cars-in-trichy/toyota-etios-2013-2014-s605950/
      http://www.carwale.com/used/cars-in-trichy/tata-indica-vista-2008-2011-s599001/
      http://www.carwale.com/used/cars-in-trichy/opel-corsa-s591616/
      http://www.carwale.com/used/cars-in-trichy/hyundai-i20-2008-2010-s596173/
      http://www.carwale.com/used/cars-in-trichy/tata-indica-vista-2012-2014-s600753/
      http://www.carwale.com/used/cars-in-trichy/fiat-punto-2009-2011-s606934/
      http://www.carwale.com/used/cars-in-trichy/mitsubishi-pajero-s597849/
      http://www.carwale.com/used/cars-in-trichy/fiat-linea20082014-s596079/
      http://www.carwale.com/used/cars-in-trichy/tata-indicav2-s597390/
      http://www.carwale.com/used/cars-in-trichy/mahindra-xylo-2009-2012-s603434/
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        • 2016-06-17
        • 2012-01-23
        • 2017-04-26
        相关资源
        最近更新 更多