首页 > 解决方案 > 抓取多个 URL 时,我在 Python 中的 Scrapy 代码不一致

问题描述

抓取多个 URL 时,我在 Python 中的 Scrapy 代码不一致。下面是一个打印屏幕,您可以在其中看到某些 url 无法抓取,而其他 url 则可以。在此处输入图像描述

下面是我的代码:

import scrapy
from scrapy_splash import SplashRequest
from scrapy_spider.items import ScrapySpiderItem

pages=0
urllist=[]
class SystemspiderSpider(scrapy.Spider):
    name = "systemspider"

    #start_urls = ["https://www.systembolaget.se/sok/? 
categoryLevel1=Vin&categoryLevel2=Ros%C3%A9vin&page=1"]

   while pages < 667:
       pages = pages+1        
       urllist.append(f"https://www.systembolaget.se/sok/? 
       categoryLevel1=Vin&page={pages}")



    start_urls = urllist


def start_requests(self):
    for url in self.start_urls:
        yield SplashRequest(url=url, callback=self.parse, endpoint='render.html')

 ## div > div > a > div.css-6ktubd > div.css-1rfq2pv > div.css-1mhygto > div.css-1eo7gke > div.css-1iyoj2o > h4

def parse(self, response):
    print("Response")

    if response.css('#captchacharacters').extract_first():
        print("-------------------------------------Captcha found------------------------------------------------------------")


    for q in response.css("div > div > a > div.css-6ktubd > div.css-1rfq2pv > div.css-1mhygto > div.css-1eo7gke > div.css-1iyoj2o"):
        #print(q)
        quote = ScrapySpiderItem()
        quote["author"] = q.css("div > h3 > span.css-uiubfo::text").extract_first()
        quote["quote"] = response.url
        yield quote

标签: pythonwebscrapy

解决方案


Scrapy 是异步框架。
来自您的代码的请求具有相同的优先级。这意味着默认情况下,这里不保证请求会以严格的顺序(page1、page2、page3 等)被调度和执行。

可以通过从parse方法中一一调度请求来解决:

def start_requests(self):
    url = "https://www.systembolaget.se/sok/?categoryLevel1=Vin&page=1"
    yield SplashRequest(url=url, callback=self.parse, endpoint='render.html')

def parse(self, response):
    print("Response")
    ....
    next_page_url =... #url for next page
    if next_page_url:
        yield SplashRequest(url=url, callback=self.parse, endpoint='render.html')

推荐阅读