嗨我下面有这个scrapy代码(我删除了很多if循环并将其简化为易于理解)。 问题就是这种scrapy,只搜索网站的第一页。我发现hte scrapy.request没有得到新的url,并且在项目['url']中总是只附加基础URL并因此下载。
import scrapy
from collections import Counter
from scrapy.selector import Selector
from Mycode.items import *
class ExampleSpider(scrapy.Spider):
name = "full_sites"
def __init__(self, site=None, *args, **kwargs):
super(ExampleSpider, self).__init__(*args, **kwargs)
self.start_urls = [site]
self.base_url = site
self._site = site
self.allowed_domains = [self._site]
def parse(self, response):
for i in response.xpath('//a/@href').extract():
print '================'
print 'i entered=', i
url = self.base_url + i
print url, 'go to scrapy'
yield scrapy.Request(url= url, callback=self.parse)
item = FullSitesItem()
item['url'] = response.url
print 'item=', item['url']
yield item
我在显示器上显示这些输出:
================
i entered= /service
http://webscraper.io/service go to scrapy
item= http://webscraper.io
================
i entered= /sitemap-specialist
http://webscraper.io/sitemap-specialist go to scrapy
item= http://webscraper.io
================
i entered= /screenshots
http://webscraper.io/screenshots go to scrapy
item= http://webscraper.io
================
所以不管传递给scrapy.Requests的url,项目['url']都是一样的!我该如何解决这个问题?
感谢
答案 0 :(得分:1)
您正在循环i
,因此response.url
将始终返回相同的结果。
您可以按照以下方式保留parse
方法:
def parse(self, response):
for i in response.xpath('//a/@href').extract():
print '================'
print 'i entered=', i
url = self.base_url + i
print url, 'go to scrapy'
yield scrapy.Request(url= url, callback=self.parse)
这将处理主页面。
创建一个不同的解析方法来处理其他页面,并将callback=self.parse
切换到新方法。