我对Scrapy和路透社有疑问。按照第https://realpython.com/blog/python/web-scraping-and-crawling-with-scrapy-and-mongodb/页上给出的示例,我想对http://www.reuters.com/news/archive/businessNews?view=page&page=1执行相同操作,即。从第一页下载信息后,我想从以下页面下载信息,但LinkExtractor功能无法正常工作。这是我的代码
class ReutersCrawlerSpider(CrawlSpider):
name = 'reuters_crawler'
allowed_domains = ['www.reuters.com',]
start_urls = [
"http://www.reuters.com/news/archive/businessNews?page=1&pageSize=10&view=page",
]
rules = [
Rule(SgmlLinkExtractor(allow=r'\?page=[0-9]&pageSize=10&view=page', restrict_xpaths=('//div[@class="pageNavigation"]',)),
callback='parse_item', follow=True)
]
def parse_item(self, response):
questions = Selector(response).xpath('//div[@class="feature"]/h2')
for question in questions:
item = ReutersItem()
item['title'] = question.xpath('a/text()').extract()[0]
item['timeextraction'] = strftime("%Y-%m-%d %H:%M:%S", gmtime())
yield item
哪里出错了?谢谢你的帮助。
答案 0 :(得分:0)
尝试使用以下代码来删除目标项目:
类ReutersCrawlerSpider(CrawlSpider):
name =' reuters_crawler'
allowed_domains = ['www.reuters.com',]
start_urls = ["http://www.reuters.com/news/archive/businessNews?view=page&page=%s" % page for page in xrange(1,10)]
'''rules = [ Rule(SgmlLinkExtractor(allow=r'\?page=[0-9]&pageSize=10&view=page', restrict_xpaths=('//div[@class="pageNavigation"]',)),
callback='parse_item', follow=True)]'''
def parse(self, response):
questions = Selector(response).xpath('.//div[@class="feature"]/h2')
for question in questions:
item = ReutersItem()
item['title'] = question.xpath('a/text()').extract()[0]
item['timeextraction'] = strftime("%Y-%m-%d %H:%M:%S", gmtime())
yield item
答案 1 :(得分:0)
Rule
和LinkExtractor
的含义是您有一个主网站,其中包含网址但不包含您要抓取的内容。为此,您可以编写parse
方法并手动提取页面上的每个URL并将其过滤到新的Request
对象 - 或者您可以使用Rule
来提取指定的链接{ {1}}匹配LinkExtractor
过滤器,可以在allow
块中找到。然后,Scrapy将自动从这些链接中创建新的restrict_xpaths
个对象,并使用Request
个callback
的{{1}}来调用Response
方法。
如果您查看您尝试抓取的网站的HTML源代码,您可以看到它有一些JavaScript可以创建Request
class="pageNavigation"
。这意味着当您尝试使用Scrapy解析站点时,您找不到指定的类来限制XPath。
我们可以使用div
方法解析parse
的结果:
start_urls
这会在控制台上生成一个空列表。这意味着def parse(self, response):
print response.xpath('//div[@class="pageNavigation"]')
正文中的div
class
不存在pageNavigation
。因此规则不会起作用。
要解决此问题,您可以使用手动解决方案从JavaScript代码中提取下一个网址 - 或者只是使用下一页编号在Respone
方法中创建请求 - 直到您遇到&# 34;未找到"站点。
parse
顺便说一句:当前的问题得到了政治视频"和#34;前排华盛顿"与每个网站。您应该在实施中对此进行限制。