首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Scrapy和reuters.com的问题

Scrapy和reuters.com的问题
EN

Stack Overflow用户
提问于 2015-08-10 19:29:27
回答 2查看 763关注 0票数 0

我对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函数无法正常工作。以下是我的代码

代码语言:javascript
复制
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

在哪里犯了错?谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2015-08-10 21:18:59

尝试使用以下代码报废预期的项目:

ReutersCrawlerSpider类(CrawlSpider):

代码语言:javascript
复制
 name = 'reuters\_crawler'
代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2015-08-17 16:22:34

RuleLinkExtractor的含义是你有一个主站点,它有URL,但没有你想要抓取的内容。为此,您可以编写parse方法并手动提取页面上的每个URL,并将它们过滤为新的Request对象--或者您可以使用Rule来提取具有LinkExtractor的指定链接,以匹配allow过滤器,这些链接可以在restrict_xpaths块中找到。然后,Scrapy将自动从这些链接创建新的Request对象,并使用这些RequestResponse调用callback方法。

如果你查看你试图爬取的网站的HTML源代码,你可以看到它有一些创建class="pageNavigation" divs的JavaScript,这意味着当你试图用Scrapy解析网站时,你没有找到指定的类来限制XPath。

为此,我们可以使用解析start_urls结果的parse方法

代码语言:javascript
复制
def parse(self, response):
    print response.xpath('//div[@class="pageNavigation"]')

这将在控制台上生成一个空列表。这意味着div的主体中不存在带有class pageNavigationRespone,因此规则将不起作用。

要解决这个问题,您可以使用手动解决方案从JavaScript代码中提取下一个URL --或者简单地在parse方法中用下一个页码创建一个请求--直到遇到一个“找不到”的站点。

代码语言:javascript
复制
current_page = 1
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
    self.current_page += 1
    yield Request("http://www.reuters.com/news/archive/businessNews?page={0}&pageSize=10&view=page".format(self.current_page))

顺便说一句:现在的问题在每个网站上都有“政治视频”和“华盛顿前排”。您应该在您的实现中限制这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31918374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档