我如何刮多页不同的字母标签使用scrapy

gcuhipw9  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(154)

我正在使用Scrapy进行一个Web抓取项目,我面临着一个问题,即用字母标签迭代多个页面。
我的目标是通过遍历字母表标签,然后循环遍历每个字母表中的页面,从网站https://www.1mg.com/drugs-all-medicines中获取医学数据。以下是我目前掌握的信息:

import scrapy
import re

class MedSpider(scrapy.Spider):
    name = "medspider"
    allowed_domains = ["www.1mg.com"]
    start_urls = ["https://www.1mg.com/drugs-all-medicines"]
    current_alphabet = 'a'  # Initial alphabet label
    current_page = 2  # Initial page number

    def parse(self, response):
        meds = response.css('div.style__flex-1___A_qoj')

        for med in meds:
            yield {
                'name': med.css('div div::text').get(),
                'price': med.css('div:has(> span)::text').getall()[-1],
                'strip content': med.css('div::text').getall()[-4],
                'manufacturer': med.css('div::text').getall()[-3],
            }

        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None and self.current_page <= 1076:
            url_page = 'https://www.1mg.com/drugs-all-medicines?page=' + str(self.current_page)
            self.current_page += 1  # Increment the page number
            yield response.follow(url_page, callback=self.parse)
        else:
            if self.current_alphabet < 'z':
                self.current_alphabet = chr(ord(self.current_alphabet) + 1)  # Increment the alphabet label
                self.current_page = 2  # Reset the page number
                url_label = 'https://www.1mg.com/drugs-all-medicines?label=' + self.current_alphabet
                yield response.follow(url_label, callback=self.parse)

现在,当我运行代码时,第一个Label及其所有页面都被捕获,但当代码移动到第二个标签'b'时,它只是刮擦'b'的第一页,然后停止迭代,并显示以下消息
调试:过滤重复请求:<GET https://www.1mg.com/drugs-all-medicines?page=2>-不再重复
问题来自不同的URL:
标签“a”第一页的URL-https://www.1mg.com/drugs-all-medicines
第二页-https://www.1mg.com/drugs-all-medicines?page=2
第三页-https://www.1mg.com/drugs-all-medicines?page=3和更多
而标签'b'的URL和向前的第一页-https://www.1mg.com/drugs-all-medicines?label=b
第二页-https://www.1mg.com/drugs-all-medicines?page=2&label=b
第三页-https://www.1mg.com/drugs-all-medicines?page=2&label=b及以后

我应该在代码中做哪些更改?

jgwigjjp

jgwigjjp1#

对我来说似乎有效的是在每个请求中将标签和页码设置为回调参数,并在每个解析方法调用结束时通过递增页码和复制标签来使用这些值制作url。当我最终停止蜘蛛时,它已经生产了42K独特的物品。
例如:

import scrapy
import string

class MedspiderSpider(scrapy.Spider):
    base = "https://www.1mg.com/drugs-all-medicines?label="
    name = "medspider"
    allowed_domains = ["www.1mg.com"]
    custom_settings = {
        "USER_AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
    }

    def start_requests(self):
        for char in string.ascii_lowercase:
            yield scrapy.Request(self.base + char, cb_kwargs={"page": 1, "label": char})

    def parse(self, response, page, label):
        for med in response.css('div.style__flex-1___A_qoj'):
            yield {
                'name': med.css('div div::text').get(),
                'price': med.css('div:has(> span)::text').getall()[-1],
                'strip content': med.css('div::text').getall()[-4],
                'manufacturer': med.css('div::text').getall()[-3],
            }
        next_page = self.base + label + f"&page={page+1}"
        yield scrapy.Request(next_page, cb_kwargs={"page": page+1, "label": label})
hzbexzde

hzbexzde2#

你有没有试过:

[...]
url_page = f'https://www.1mg.com/drugs-all-medicines?page={self.current_page}&label={self.current_alphabet}'
[...]

相关问题