首页 > 解决方案 > Python Scrapy在一些请求后停止而没有任何错误

问题描述

我正在尝试使用 Scrapy(2.5.0) Python (3.6.0) 抓取一些数据

Scrapy 适用于大约 70 到 100 的一些 url,它只是在 Spider 关闭(完成)的情况下退出,没有任何错误

但是有超过 200K+ 请求

import scrapy 
from scrapy.linkextractors import LinkExtractor
# import pandas as pd
import pymongo

client = pymongo.MongoClient("mongodb+srv://<user>:<Password>@booksmotionscraper.9c8us.mongodb.net/booksmotion?retryWrites=true&w=majority")

db= client.libgen.libgen2

start = True
class lSpider(scrapy.Spider): 
  name = "libgen_dlink"
  start_urls = [ 
          "https://booksmotion.com/main/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
   ]

  def parse(self, response):
    global start
    link= db.find_one({})
    
    url= 'https://booksmotion.com/main/'+link['md5']
    yield scrapy.Request(url, callback=self.parse)
    # link= list(link)
    # print(link)
    db.delete_one({'_id': link['_id']})
    body= response.css('body')
    try:
      info={
        'md5': response.url.rsplit('/', 1)[-1],
        'dlink': body.css('#download > ul > li:nth-child(2) > a').attrib['href']
      }
    except KeyError:
      info={
        'md5': response.url.rsplit('/', 1)[-1],
        'dlink': 0
      }
    yield{
      'md5': info['md5'],
      'dlink': info['dlink']
    }

标签: pythonweb-scrapingscrapy

解决方案


由于 Database Scrapy 中的一些重复默认情况下会跳过该 url 等等,因为 url 是在解析函数中添加的,并且当有重复的 url 时不会调用 purse 函数,所以没有更多的 url 可以抓取scrapy 关闭蜘蛛。

添加 dont_filter= True 解决问题

  yield scrapy.Request(url, dont_filter=True,  callback=self.parse)

推荐阅读