我对刮板还比较陌生,我想知道是否有一种方法可以将引荐来源网址传递给response.follow()命令。我正试图从整整一块土地上抓取房地产土地价格,但在抓紧追踪分页链接方面遇到麻烦。搜寻器在主页上可以正常工作,但该网站不允许它访问其他任何页面。
我试图在scrapy shell中使用fetch命令直接打开第二页,但是没有用。我使用视图打开页面以检查元素,发现以下错误:
“ CORS策略已阻止从原点'null'访问'https://someaddress.com处的XMLHttpRequest:所请求的资源上没有'Access-Control-Allow-origin'标头。”
任何建议或资源将不胜感激。
-谢谢
import scrapy
class cwSpider(scrapy.Spider):
name = 'cushman2'
custom_settings = {
'DUPEFILTER_DEBUG': 'True',
}
start_urls = ['https://cwstevenson.ca/properties/advance-search-properties/']
def parse(self, response):
# follow links to author pages
for href in response.css('.wpl_prp_bot a::attr(href)'):
yield response.follow(href, self.parse_property)
# follow pagination links
for href in response.css('li.next a::attr(href)'):
yield response.follow(href, self.parse)
def parse_property(self, response):
response.request.headers.get('Referrer', None)
def extract_with_css(query):
return response.css(query).extract()
yield {
'address' : extract_with_css('h1.title_text::text'),
'Prop_Type': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[0],
'Land Area': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[1],
'Price': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[2],
'Listing_Type': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[3],
'Area_Avail': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[4],
'Prop_Taxes': extract_with_css('.ldetailscont2 p.ldetailsinfo::text')[5],
}
答案 0 :(得分:1)
您需要将链接提取为字符串,否则它将返回selector
个列表。
response.follow
需要url
作为字符串。它不接受selector
对象的列表。
因为response.follow
无法收到有效的参数-无法执行下一个请求
def parse(self, response):
# follow links to author pages
for href in response.css('.wpl_prp_bot a::attr(href)').extract(): #
yield response.follow(href, self.parse_property)
# follow pagination links
for href in response.css('li.next a::attr(href)').extract(): #
yield response.follow(href, self.parse)
答案 1 :(得分:0)
在.follow行中使用header参数,您可以将任何相关信息传递给follow命令,以满足站点标题。在这种情况下,它是引荐来源。要了解网站标题,您可以在chrome中打开“开发人员”标签,依次转到“网络”标签和“ XHR”标签(请确保该文件在加载网站时处于打开状态,如果打开后不只是刷新页面)单击标题标签,然后向下滚动,直到在标题部分下看到引荐来源。您可以使用它来填充sprider中的标题。我相信可以通过您的中间件来执行此操作,但是似乎没有一个选项可以满足此问题的要求。(例如:same_origin,origin ... ect)
def parse(self, response):
# follow links to author pages
for href in response.css('.wpl_prp_bot a::attr(href)').extract():
yield response.follow(href, self.parse_property, headers = {'User-Agent': 'Chrome/71.0.3578.98', "Referer": href})
# follow pagination links
for href in response.css('li.next a::attr(href)').extract():
yield response.follow(href, self.parse,headers = {'User-Agent': 'Chrome/71.0.3578.98', "Referer": href})