我正在使用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及以后
我应该在代码中做哪些更改?
2条答案
按热度按时间jgwigjjp1#
对我来说似乎有效的是在每个请求中将标签和页码设置为回调参数,并在每个解析方法调用结束时通过递增页码和复制标签来使用这些值制作url。当我最终停止蜘蛛时,它已经生产了42K独特的物品。
例如:
hzbexzde2#
你有没有试过: