Scrapy-处理加载有404状态代码的页面

时间:2019-07-30 12:46:35

标签: python http web-scraping scrapy

This是我要抓取的网站。页面中的广告正在加载,没有任何问题,但是它们始终以404状态代码加载,因此scrapy不会从这些链接中产生任何物品。

如果我从外壳向广告发送请求,它将重试10次,并返回有效的响应。但是,当我使用scrapy crawl myspider命令运行脚本时,广告没有返回有效的响应,因此scrapy尝试一次发送请求。

这是来自随机项目的错误代码。

2019-07-30 15:33:51 [scrapy] DEBUG: Retrying <GET https://www.classifiedads.com/homes_for_sale/57c10snzt1wzz> (failed 1 times): 404 Not Found
2019-07-30 15:33:51 [scrapy] DEBUG: Retrying <GET https://www.classifiedads.com/homes_for_sale/49zbgqvx21wzz> (failed 1 times): 404 Not Found
2019-07-30 15:33:51 [scrapy] DEBUG: Retrying <GET https://www.classifiedads.com/homes_for_sale/49482b3hq1wzz> (failed 1 times): 404 Not Found

这是我的蜘蛛代码。我该如何解决这个问题?

class MySpider(CrawlSpider):

    name = 'myspider'

    start_urls = [
        'https://www.classifiedads.com/search.php?keywords=&cid=468&lid=rx10&lname=India&from=s&page=1',
        'https://www.classifiedads.com/search.php?keywords=&cid=18&lid=rx10&lname=India&page=1'
    ]

    rules = (
        Rule(LinkExtractor(allow=(r'https://www.classifiedads.com/search.php\?keywords=&cid=468&lid=rx10&lname=India&from=s&page=\d+',)), callback='parse_page', follow=True),
        Rule(LinkExtractor(allow=(r'https://www.classifiedads.com/search.php\?keywords=&cid=18&lid=rx10&lname=India&page=\d+',)), callback='parse_page', follow=True)
    )

    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
        'upgrade-insecure-requests': 1,

    }

    def parse_page(self, response):
        items = response.css('div#results div.resultitem div a::attr(href)').getall()

        if items:
            for item in items:
                if item.startswith('//www.classifiedads.com/'):
                    yield scrapy.Request(
                        url='https:{}'.format(item),
                        method='GET',
                        headers=self.headers,
                        callback=self.parse_items
                    )

    def parse_items(self, response):
        # scraping the items

3 个答案:

答案 0 :(得分:1)

Pass 'handle_httpstatus_list': [404] in the meta parameter of your requests(如果他们正在发送带有404作为状态码的有效响应)来通过您的回调处理404响应。

答案 1 :(得分:0)

我建议您首先检查这些retry settings并将404状态代码添加到RETRY_HTTP_CODES。另一种解决方案是创建errback函数并将其添加到您的请求中。但是所有这些解决方案都不好。您是否尝试添加一些标题,cookie?

答案 2 :(得分:0)

服务器抛出404响应。 您也可以在终端中检查 >>> import requests requests.get('https://www.classifiedads.com/commercial_for_rent/9144lxkm81wxd') <Response [404]>

您可以尝试使用硒。