我的抓取工具中有此代码
class StackSpider(InitSpider):
name = 'stack'
allowed_domains = ['sitepoint.com']
start_urls = ["http://www.sitepoint.com"]
start_page = "http://www.sitepoint.com"
item = StackItem()
def init_request(self):
return Request(url=self.start_page, callback=self.parse)
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//div[@class="headline_area"]')
items = []
ivar = 1
for site in sites[:5]:
item = StackItem()
log.msg(' LOOP' +str(ivar)+ '', level=log.ERROR)
item['title'] ="yoo ma"
request = Request("http://www.sitepoint.com/getting-to-know-css3-selectors-structural-pseudo-classes/", callback=self.test1)
request.meta['item'] = item
ivar = ivar + 1
yield request
def test1(self, response):
log.msg(' LOOP 2 \n', level=log.ERROR)
item = response.meta['item']
item['desc'] = "test4"
return item
我是根据documentation完成的,但它只适用于一个循环。 我的意思是我只能在登录屏幕上看到
LOOP1
LOOP2
应该重复3次
我尝试了返回和收益的不同组合,所以
return request
和return item
提供输出LOOP1 LOOP2
yield request
和return item
提供输出LOOP1 LOOP1 LOOP1 LOOP2
yield request
和yield item
提供输出LOOP1 LOOP1 LOOP1 LOOP2
return request
和yield item
提供输出LOOP1 LOOP2
我如何获得LOOP 1 LOOP2 LOOP1 LOOP2 AND so on
答案 0 :(得分:5)
问题出现在你的循环中
for site in sites[:5]:
您多次在循环中请求1个相同的网址。
默认情况下,Scrapy会过滤相同的请求并忽略它们。
如果您想多次请求相同的网址,则需要设置 dont_filter=True
request = Request("http://www.sitepoint.com/getting-to-know-css3-selectors-structural-pseudo-classes/",
dont_filter=True,
callback=self.test1)
那么它应该重复3次
答案 1 :(得分:1)
我认为你没有进入Loop 2
的原因是因为你已经对Request
中的网址进行了硬编码。 Scrapy不会多次访问已访问过的URL。
尝试更改该网址并查看其效果。不要依赖于消息的顺序,因为Requests
没有按顺序发生