当前位置: 代码迷 >> python >> 为什么 Scrapy Spider 不跟随下一页?
  详细解决方案

为什么 Scrapy Spider 不跟随下一页?

热度:35   发布时间:2023-07-16 10:45:06.0

我的代码在下一页上不起作用。 它只是抓取第一页,不跟随下一页链接。 我正在使用 anaconda 虚拟环境。

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

class Dgoodyman16Spider(scrapy.Spider):
    name = 'dgoodyman16'
    allowed_domains = ['www.medicregister.com']
    start_urls = ['https://www.medicregister.com/USA/list/suppliers.asp']

    def parse(self, response):
        all_lists = response.xpath('//a[@class="TopicHeaderSupplier"]')
        for lists in all_lists:
            title = lists.xpath('.//text()').get()
            links = lists.xpath('.//@href').get()


            yield response.follow(url=links, callback=self.parse_lists, meta={'lists_title': title})

    def parse_lists(self, response):

        title = response.request.meta['lists_title']

        for data in response.xpath('//div[@class="vcard"]'):
            raw_html = data.xpath('.//div[@style="line-height: 1.5;"]').extract()
            tel = data.xpath('.//span[@class="tel"]/text()').get()
            # email = response.xpath('(//div[@class="vcard"]/a)[2]/@href').get()


        yield {
            'Title': title,
            'html': raw_html,
            'Phone': tel
        }

        next_page = response.xpath('((//div[@class="margin-5"])[2]/a)[10]').get()
        if next_page:
            next_page = response.urljoin(next_page)
            yield scrapy.Request(url=next_page, callback=self.parse)

您是否考虑过收集导航中的所有 URL,删除重复项并关注所有 URL? 集合中的 URL 是有效的。

relative_urls = set(
    response.xpath('//div[contains(@class, "margin-5")]/a/@href').getall()
)
absolute_urls = {
    response.urljoin(url) for url in relative_urls
}

我建议您打开一个scrapy shell,获取start_urls 中给出的URL,然后重新检查您唯一的xpath。 如果它没有返回一个相对 URL,你就知道为什么爬虫会停在这里。

更好的是将完整列表放入 start_urls:

start_urls = ['https://www.medicregister.com/USA/Manufacturers/Suppliers/Page%d/cid.htm' % i for i in range(1,730)]

这比跟随下一页快得多,这不会异步发生

  相关解决方案