我正在尝试使用 scrapy 抓取一些内部有很多链接的页面,但到目前为止我的现有代码只显示第一个链接的内容。
我犯了什么错误?
from scrapy.spiders import BaseSpider
from scrapy.spiders import Spider
from scrapy.http.request import Request
from scrapy.selector import Selector
from Proje.items import ProjeItem
class ProjeSpider(BaseSpider):
name = "someweb"
allowed_domains = ["someweb.com"]
start_urls = [
"http://someweb.com/indeks/"
]
def parse(self, response):
for sel in response.xpath('//ul[@id="indeks-container"]'):
for tete in sel.xpath('//linkkk').re('//linkkk.*?(?=")'):
links = 'http:'+str(tete)
req = Request(links,callback=self.kontene)
return req
def kontene(self, response):
for mbuh in response.xpath('//head'):
Item = ProjeItem()
Item['title'] = mbuh.xpath('//title/text()').extract()
yield Item
答案 0 :(得分:1)
问题是您的return
循环中有for
个声明。在Python中,return
将返回该函数,仅为您提供第一个值得内容的链接。相反,请考虑将req
添加到返回的对象列表中。
def parse(self, response):
req_list = []
for sel in response.xpath('//ul[@id="indeks-container"]'):
for tete in sel.xpath('//linkkk').re('//linkkk.*?(?=")'):
links = 'http:'+str(tete)
req = Request(links,callback=self.kontene)
req_list += req
return req_list
答案 1 :(得分:1)
根据sc Request
return
的scrapy文档,即列表或生成器。只需将yield
更改为def parse(self, response):
for sel in response.xpath('//ul[@id="indeks-container"]'):
for tete in sel.xpath('//linkkk').re('//linkkk.*?(?=")'):
links = 'http:'+str(tete)
req = Request(links,callback=self.kontene)
yield req
即可按预期运行:
{{1}}