python-3.x - 使用规则在主页面完成后抓取 'next' 页面

标签 python-3.x web-scraping scrapy

我正在尝试制作一个蜘蛛,它可以从页面上抓取产品,完成后,抓取目录中的下一页以及之后的下一页,等等。

我从一个页面(我正在抓取亚马逊)获取了所有产品

rules = {

        Rule(LinkExtractor(allow =(), restrict_xpaths = ('//a[contains(@class, "a-link-normal") and contains(@class,"a-text-normal")]') ), 
                                callback = 'parse_item', follow = False)

    }

效果很好。问题是我应该转到“下一页”并继续抓取。

我试图做的是这样的规则

rules = {

        #Next Button
        Rule(LinkExtractor(allow =(), restrict_xpaths = ('(//li[@class="a-normal"]/a/@href)[2]') )),

}

问题是 xPath 返回(例如,从此页面: https://www.amazon.com/s?k=mac+makeup&lo=grid&page=2&crid=2JQQNTWC87ZPV&qid=1559841911&sprefix=MAC+mak%2Caps%2C312&ref=sr_pg_2 )

/s?k=mac+makeup&lo=grid&page=3&crid=2JQQNTWC87ZPV&qid=1559841947&sprefix=MAC+mak%2Caps%2C312&ref=sr_pg_3

这将是下一页的 URL,但不含 www.amazon.com。

我认为我的代码不起作用,因为我在上面的网址之前缺少 www.amazon.com。

知道如何实现这个功能吗?也许我这样做的方式不正确。

最佳答案

尝试使用 urljoin。

link = "/s?k=mac+makeup&lo=grid&page=3&crid=2JQQNTWC87ZPV&qid=1559841947&sprefix=MAC+mak%2Caps%2C312&ref=sr_pg_3"


new_link = response.urljoin(link)

下面的蜘蛛是一个可能的解决方案,主要思想是使用parse_links函数来获取到单个页面的链接,该页面产生对解析函数的响应,并且您还可以对同一函数产生下一页响应,直到您已爬完所有页面。


class AmazonSpider(scrapy.spider):

    start_urls = ['https://www.amazon.com/s?k=mac+makeup&lo=grid&crid=2JQQNTWC87ZPV&qid=1559870748&sprefix=MAC+mak%2Caps%2C312&ref=sr_pg_1'
    wrapper_xpath = '//*[@id="search"]/div[1]/div[2]/div/span[3]/div[1]/div' # Product wrapper
    link_xpath = './//div/div/div/div[2]/div[2]/div/div[1]/h2/a/@href' # Link xpath
    np_xpath = '(//li[@class="a-normal"]/a/@href)[2]' # Next page xpath


    def parse_links(self, response):
        for li in response.xpath(self.wrapper_xpath):
            link = li.xpath(self.link_xpath).extract_first()
            link = response.urljoin(link)
            yield scrapy.Request(link, callback = self.parse)

        next_page = response.xpath(self.np_xpath).extract_first()

        if next_page is not None:
            next_page_link = response.urljoin(next_page)
            yield scrapy.Request(url=next_page_link, callback=self.parse_links)
        else:
            print("next_page is none")

关于python-3.x - 使用规则在主页面完成后抓取 'next' 页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56482563/

相关文章:

python - 请求 Python 中的 url 超出了最大重试次数

python - Scrapy 将 %0A 添加到 URL,导致它们失败

python - 将额外的值连同 url 一起传递给 scrapy spider

python - 有没有一种方法可以在不使用 winsound 的情况下产生特定频率的哔声?

python - 循环后,将所有迭代元素返回到列表的正确方法是什么?

python - 由于文件名而无法导入文件

python - 使用 BeautifulSoup 抓取具有不变 URL 的多个页面

python - 自动检测来自用户给定项目的 Xpath 作为输入

python - 无法将更大的 DataFrames 放入队列中

python - 使用 scrapy 抓取项目