[英]How to implement Request function on scrapy spider
from string import join
from scrapy.contrib.spiders.crawl import CrawlSpider
from scrapy.selector import Selector
from scrapy.http.request import Request
from article.items import ArticleItem
class ArticleSpider(CrawlSpider):
name = "article"
allowed_domains = ["http://joongang.joins.com"]
j_classifications = ['politics','money','society','culture']
start_urls = ["http://news.joins.com/%s" % classification for
classification in j_classifications]
def parse_item(self, response):
sel = Selector(response)
urls = sel.xpath('//div[@class="bd"]/ul/li/strong')
items = []
for url in urls:
item = ArticleItem()
item['url'] = url.xpath('a/@href').extract()
items.append(item)
request = Request(items['url'], callback=self.parse_item2)
request.meta['item'] = items
return request
def parse_item2(self,response):
item = response.meta['item']
sel = Selector(response)
articles = sel.xpath('//div[@id=article_body]')
for article in articles:
item['article'] = article.xpath('text()').extract()
items.append(item)
return item
此代碼用於商品報廢。 我已經被沙皮了。 parse_item方法是針對使用請求函數發送到parse_item2的文章的url實現的。 但是此代碼不起作用。 Item類確實實現了url = Field(),article = Field()。 我怎么解決這個問題。 PS Web標記正確。 我確實在刮皮殼上進行了測試。
該行中的代碼有問題:
request = Request(items['url'], callback=self.parse_item2)
items
是item
對象的列表。 因此它將引發TypeError。 您可以使用第二個for循環來完成此操作,
for itm in items:
request = Request(itm['url'], callback=self.parse_item2)
request.meta['item'] = items
yield request
或者從第一個for循環產生一個請求,
for url in urls:
item = ArticleItem()
item['url'] = url.xpath('a/@href').extract()
request = Request(items['url'], callback=self.parse_item2)
request.meta['item'] = items
yield request
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.