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
答案 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]>
您可以尝试使用硒。