在python 2.x环境中使用Scrapy时,我设置了一个Spider来抓取网页列表,特别是查看其中任何网页是否产生错误,例如400/404/500。

我编写了scrapy项目,目的是通过管道将所有抓取结果存储在mysql数据库中。
而且有效!我能够成功写入我的数据库。但仅适用于成功抓取的页面,其HTTP状态代码为200。

Scrapy似乎没有通过管道在404页上发送信息到数据库。

以下是Spider代码的摘录,该代码抓取了两个不存在的网页:

class LandingPage004Spider(scrapy.Spider):
name='LandingPage004Spider'
start_urls = []

def __init__(self):
    super(LandingPage004Spider,self).__init__()
    #self.start_urls = unique_landingpages
    self.start_urls = ['https://www.google.com/doesntexist', 'https://www.google.com/deadpage']

def parse(self, response):
    url = response.url
    url_title = 'Title goes here.'
    pagesize = len(response.body)
    HTTP_code = response.status
    yield {'url': url, "pagesize": pagesize, "HTTP_code": HTTP_code}


运行该蜘蛛时,将得到以下输出:

[scrapy] DEBUG: Ignoring response <404 https://www.google.com/deadpage>: HTTP status code is not handled or not allowed
[scrapy] DEBUG: Ignoring response <404 https://www.google.com/doesntexist>: HTTP status code is not handled or not allowed


现在,我已经对此进行了一些繁重的搜索,看来这可能是有目的的,并且有一种方法可以强制scrapy包含404。我看到有一个选项dont_filter,但是我只能找到有关如何将该代码附加到类似于以下代码的语法的说明:
产生请求(url =“ test.com”,callback = self.callback,dont_filter = True)

但是我的蜘蛛的结构似乎不允许有这样的线条。

我是否正确设计了404并没有将其发送到数据库?
有没有一种方法可以附加我的当前代码以允许记录404?

如果有帮助,请参阅以下pipelines.py文件:

from sqlalchemy.orm import sessionmaker
from LandingPageVerifier.models import LandingPagesScrapeResults, db_connect

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.engine import create_engine

Base = declarative_base()

class Landingpageverifier004Pipeline(object):
    def __init__(self):
        """
        Initializes database connection and sessionmaker.
        """
        engine = db_connect()
        self.Session = sessionmaker(bind=engine)

def process_item(self, item, spider):
    session = self.Session()
    landingpage_scrape_results = LandingPagesScrapeResults()
    landingpage_scrape_results.url = item["url"]
    landingpage_scrape_results.client_id = 1
    landingpage_scrape_results.HTTP_code = item["HTTP_code"]
    landingpage_scrape_results.page_size = item["pagesize"]

    try:
        session.add(landingpage_scrape_results)
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

    return item


以及我的models.py文件的摘录:

class LandingPagesScrapeResults(Base):
    __tablename__ = 'landingpages_scrape_results'
    id = Column(Integer(), primary_key=True)
    client_id = Column(Integer(), ForeignKey('landingpages_clients.id'))
    url = Column(String(512), nullable=True)
    url_shortener = Column(String(32), nullable=True)
    url_title = Column(String(256), nullable=True)
    page_size = Column(Integer(), nullable=True)
    created_on = Column(DateTime(),default=datetime.datetime.now)
    HTTP_code = Column(String(4), nullable=True)
    err_small = Column(String(1), nullable=True)
    err_has_not_found = Column(String(1), nullable=True)
    err_has_error = Column(String(1), nullable=True)
    err_has_nolongeravailable  = Column(String(1), nullable=True)
    err_no_service_specials = Column(String(1), nullable=True)

最佳答案

HttpErrorMiddleware docs


  根据HTTP标准,成功的响应是那些
  状态代码在200-300范围内。
  
  如果您仍要处理超出该范围的响应代码,则可以
  可以指定蜘蛛可以使用的响应代码
  handle_httpstatus_list蜘蛛属性或HTTPERROR_ALLOWED_CODES
  设置。
  
  例如,如果您希望蜘蛛处理404响应,则可以
  做这个:

class MySpider(CrawlSpider):
    handle_httpstatus_list = [404]

  
  handle_httpstatus_listRequest.meta键还可用于指定允许使用的响应代码
  根据每个请求。您还可以设置元密钥
  如果要允许任何响应代码,请从handle_httpstatus_all转换为True
  要求。
  
  但是请记住,处理非200
  除非您真的知道自己在做什么。

关于python - Scrapy:通过管道发送到数据库时,包含带有404状态代码的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53731561/

10-16 21:36
查看更多