【问题标题】:How to scrape website with multiple pages using scrapy如何使用scrapy抓取具有多个页面的网站
【发布时间】:2019-11-16 05:06:56
【问题描述】:

我正在尝试使用scrapy 抓取this website(有多个页面)。问题是我找不到下一页 URL。 您是否知道如何抓取具有多个页面的网站(使用 scrapy)或如何解决我的代码出现的错误?

我尝试了下面的代码,但它不起作用:

class AbcdspiderSpider(scrapy.Spider):
    """
    Class docstring
    """
    name = 'abcdspider'
    allowed_domains = ['abcd-terroir.smartrezo.com']

    alphabet = list(string.ascii_lowercase)
    url = "https://abcd-terroir.smartrezo.com/n31-france/annuaireABCD.html?page=1&spe=1&anIDS=31&search="
    start_urls = [url + letter for letter in alphabet]

    main_url = "https://abcd-terroir.smartrezo.com/n31-france/"


    crawl_datetime = str(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    start_time = datetime.datetime.now()

    def parse(self, response):
        self.crawler.stats.set_value("start_time", self.start_time)
        try:
            page = response.xpath('//div[@class="pageStuff"]/span/text()').get()
            page_max = get_num_page(page)

            for index in range(page_max):
                producer_list = response.xpath('//div[@class="clearfix encart_ann"]/@onclick').getall()
                for producer in producer_list:
                    link_producer = self.main_url + producer
                    yield scrapy.Request(url=link_producer, callback=self.parse_details)

                next_page_url = "/annuaireABCD.html?page={}&spe=1&anIDS=31&search=".format(index)

                if next_page_url is not None:
                    yield scrapy.Request(response.urljoin(self.main_url + next_page_url))

        except Exception as e:
            self.crawler.stats.set_value("error", e.args)

我收到此错误:

'error': ('range() integer end argument expected, got unicode.',)

【问题讨论】:

    标签: python html http web-scraping scrapy


    【解决方案1】:

    错误在这里:

    page = response.xpath('//div[@class="pageStuff"]/span/text()').get()
    page_max = get_num_page(page)
    

    范围函数需要一个整数值(1、2、3、4 等)而不是 unicode 字符串('Page 1 / 403' )

    我对范围错误的建议是

    page = response.xpath('//div[@class="pageStuff"]/span/text()').get().split('/ ')[1]
    
    for index in range(int(page)):
        #your actions
    

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多