【问题标题】:How to scrape website with infinte scrolling?如何通过无限滚动抓取网站?
【发布时间】:2013-11-11 14:39:06
【问题描述】:

我想爬取this website。我写了一个蜘蛛,但它只爬首页,即前 52 项。

我试过这段代码:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request
a=[]
from aqaq.items import aqaqItem
import os
import urlparse
import ast

    class aqaqspider(BaseSpider):
        name = "jabong"
        allowed_domains = ["jabong.com"]
        start_urls = [
            "http://www.jabong.com/women/clothing/womens-tops/",
        ]

        def parse(self, response):
            # ... Extract items in the page using extractors
                    n=3
                    ct=1

                    hxs = HtmlXPathSelector(response)
                    sites=hxs.select('//div[@id="page"]')
                    for site in sites:
                            name=site.select('//div[@id="content"]/div[@class="l-pageWrapper"]/div[@class="l-main"]/div[@class="box box-bgcolor"]/section[@class="box-bd pan mtm"]/ul[@id="productsCatalog"]/li/a/@href').extract()
                            print name
                            print ct
                            ct=ct+1
                            a.append(name)
                    req= Request (url="http://www.jabong.com/women/clothing/womens-tops/?page=" + str(n) ,
                    headers = {"Referer": "http://www.jabong.com/women/clothing/womens-tops/",
                            "X-Requested-With": "XMLHttpRequest"},callback=self.parse,dont_filter=True)

                    return req # and your items

它显示以下输出:

2013-10-31 09:22:42-0500 [jabong] DEBUG: Crawled (200) <GET http://www.jabong.com/women/clothing/womens-tops/?page=3> (referer: http://www.jabong.com/women/clothing/womens-tops/)
2013-10-31 09:22:42-0500 [jabong] DEBUG: Filtered duplicate request: <GET http://www.jabong.com/women/clothing/womens-tops/?page=3> - no more duplicates will be shown (see DUPEFILTER_CLASS)
2013-10-31 09:22:42-0500 [jabong] INFO: Closing spider (finished)
2013-10-31 09:22:42-0500 [jabong] INFO: Dumping Scrapy stats:

当我输入dont_filter=True 时,它永远不会停止。

【问题讨论】:

  • 你找到解决方案了吗?
  • 不,我没有任何解决办法。

标签: javascript python-2.7 web-scraping scrapy


【解决方案1】:

是的,这里必须使用dont_filter,因为每次您将页面向下滚动到底部时,XHR 请求中只有page GET 参数更改为http://www.jabong.com/women/clothing/womens-tops/?page=X

现在您需要弄清楚如何停止抓取。这实际上很简单 - 只需检查队列中下一页何时没有产品并提出CloseSpider exception

这是一个适用于我的完整代码示例(停在第 234 页):

import scrapy
from scrapy.exceptions import CloseSpider
from scrapy.spider import BaseSpider
from scrapy.http import Request


class Product(scrapy.Item):
    brand = scrapy.Field()
    title = scrapy.Field()


class aqaqspider(BaseSpider):
    name = "jabong"
    allowed_domains = ["jabong.com"]
    start_urls = [
        "http://www.jabong.com/women/clothing/womens-tops/?page=1",
    ]
    page = 1

    def parse(self, response):
        products = response.xpath("//li[@data-url]")

        if not products:
            raise CloseSpider("No more products!")

        for product in products:
            item = Product()
            item['brand'] = product.xpath(".//span[contains(@class, 'qa-brandName')]/text()").extract()[0].strip()
            item['title'] = product.xpath(".//span[contains(@class, 'qa-brandTitle')]/text()").extract()[0].strip()
            yield item

        self.page += 1
        yield Request(url="http://www.jabong.com/women/clothing/womens-tops/?page=%d" % self.page,
                      headers={"Referer": "http://www.jabong.com/women/clothing/womens-tops/", "X-Requested-With": "XMLHttpRequest"},
                      callback=self.parse, 
                      dont_filter=True)

【讨论】:

    【解决方案2】:

    你可以试试这个代码,与alecxe的代码略有不同,

    如果没有产品,那么只需从函数中return 并最终导致关闭蜘蛛。简单的解决方案。

    import scrapy
    from scrapy.exceptions import CloseSpider
    from scrapy.spider import Spider
    from scrapy.http import Request
    
    
    class aqaqItem(scrapy.Item):
        brand = scrapy.Field()
        title = scrapy.Field()
    
    
    class aqaqspider(Spider):
        name = "jabong"
        allowed_domains = ["jabong.com"]
        start_urls = ["http://www.jabong.com/women/clothing/womens-tops/?page=1"]
        page_index = 1
    
        def parse(self, response):
            products = response.xpath("//li[@data-url]")
            if products:
                for product in products:
                    brand = product.xpath(
                        ".//span[contains(@class, 'qa-brandName')]/text()").extract()
                    brand = brand[0].strip() if brand else 'N/A'
                    title = product.xpath(
                        ".//span[contains(@class, 'qa-brandTitle')]/text()").extract()
                    title = title[0].strip() if title else 'N/A'
                    item = aqaqItem()
                    item['brand']=brand,
                    item['title']=title
                    yield item
            # here if no products are available , simply return, means exiting from
            # parse and ultimately stops the spider
            else:
                return
    
            self.page_index += 1
            if page_index:
                yield Request(url="http://www.jabong.com/women/clothing/womens-tops/?page=%s" % (self.page_index + 1),
                              callback=self.parse)
    

    尽管蜘蛛产生了超过 12.5k 的产品,但它包含许多重复的条目,我已经创建了一个 ITEM_PIPELINE,它将删除重复的条目并插入到 mongodb。

    管道代码如下,

    from pymongo import MongoClient
    
    
    class JabongPipeline(object):
    
        def __init__(self):
            self.db = MongoClient().jabong.product
    
        def isunique(self, data):
            return self.db.find(data).count() == 0
    
        def process_item(self, item, spider):
            if self.isunique(dict(item)):
                self.db.insert(dict(item))
            return item
    

    并在此处附加scrapy日志状态

    2015-04-19 10:00:58+0530 [jabong] INFO: Dumping Scrapy stats:
           {'downloader/request_bytes': 426231,
            'downloader/request_count': 474,
            'downloader/request_method_count/GET': 474,
            'downloader/response_bytes': 3954822,
            'downloader/response_count': 474,
            'downloader/response_status_count/200': 235,
            'downloader/response_status_count/301': 237,
            'downloader/response_status_count/302': 2,
            'finish_reason': 'finished',
            'finish_time': datetime.datetime(2015, 4, 19, 4, 30, 58, 710487),
            'item_scraped_count': 12100,
            'log_count/DEBUG': 12576,
            'log_count/INFO': 11,
            'request_depth_max': 234,
            'response_received_count': 235,
            'scheduler/dequeued': 474,
            'scheduler/dequeued/memory': 474,
            'scheduler/enqueued': 474,
            'scheduler/enqueued/memory': 474,
            'start_time': datetime.datetime(2015, 4, 19, 4, 26, 17, 867079)}
    2015-04-19 10:00:58+0530 [jabong] INFO: Spider closed (finished)
    

    【讨论】:

    【解决方案3】:

    如果您在该页面上打开开发者控制台,您会看到页面内容在 webrequest 中返回:

    http://www.jabong.com/home-living/furniture/new-products/?page=1

    这将返回一个包含所有项目的 HTML 文档。因此,我只会增加 page 的值并对其进行解析,直到返回的 HTML 等于之前返回的 HTML。

    【讨论】:

    • 但是该链接直接将您重定向到主页因此无法提取该链接中的页面我也尝试使用该网址进行爬网但它只显示主页源所以如何做到这一点任何想法我做错了什么??
    【解决方案4】:

    使用dont_filter 并每次发出新请求确实会永远运行,除非有一些错误响应。

    在您的浏览器中进行无限滚动,看看当它没有更多页面时的响应是什么。然后,在蜘蛛中,通过不发出新请求来处理这种情况。

    【讨论】:

      【解决方案5】:
      $curl_handle=curl_init();    
      curl_setopt($curl_handle,CURLOPT_URL,'http://www.jabong.com/women/clothing/womens-tops/?page=3');    
      curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0');    
      curl_setopt($curl_handle, CURLOPT_HTTPHEADER, array('X-Requested-With: XMLHttpRequest'));    
      curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);
      $htmldata = curl_exec($curl_handle);    
      curl_close($curl_handle);
      

      它对我有用。请通过 PHP Curl 调用

      【讨论】:

      • 它不属于这里。 OP正在询问python + Scrapy的具体解决方案。
      猜你喜欢
      • 1970-01-01
      • 2012-09-13
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 2020-05-30
      • 2021-07-23
      • 2021-01-21
      • 1970-01-01
      相关资源
      最近更新 更多