Scrapy和reuters.com的问题

时间:2015-08-10 11:29:27

标签: python mongodb scrapy

我对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

哪里出错了?谢谢你的帮助。

2 个答案:

答案 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)

RuleLinkExtractor的含义是您有一个主网站,其中包含网址但不包含您要抓取的内容。为此,您可以编写parse方法并手动提取页面上的每个URL并将其过滤到新的Request对象 - 或者您可以使用Rule来提取指定的链接{ {1}}匹配LinkExtractor过滤器,可以在allow块中找到。然后,Scrapy将自动从这些链接中创建新的restrict_xpaths个对象,并使用Requestcallback的{​​{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;前排华盛顿"与每个网站。您应该在实施中对此进行限制。