我对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
在哪里犯了错?谢谢你的帮助。
发布于 2015-08-10 21:18:59
尝试使用以下代码报废预期的项目:
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
发布于 2015-08-17 16:22:34
Rule
和LinkExtractor
的含义是你有一个主站点,它有URL,但没有你想要抓取的内容。为此,您可以编写parse
方法并手动提取页面上的每个URL,并将它们过滤为新的Request
对象--或者您可以使用Rule
来提取具有LinkExtractor
的指定链接,以匹配allow
过滤器,这些链接可以在restrict_xpaths
块中找到。然后,Scrapy将自动从这些链接创建新的Request
对象,并使用这些Request
的Response
调用callback
方法。
如果你查看你试图爬取的网站的HTML源代码,你可以看到它有一些创建class="pageNavigation"
div
s的JavaScript,这意味着当你试图用Scrapy解析网站时,你没有找到指定的类来限制XPath。
为此,我们可以使用解析start_urls
结果的parse
方法
def parse(self, response):
print response.xpath('//div[@class="pageNavigation"]')
这将在控制台上生成一个空列表。这意味着div
的主体中不存在带有class
pageNavigation
的Respone
,因此规则将不起作用。
要解决这个问题,您可以使用手动解决方案从JavaScript代码中提取下一个URL --或者简单地在parse
方法中用下一个页码创建一个请求--直到遇到一个“找不到”的站点。
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))
顺便说一句:现在的问题在每个网站上都有“政治视频”和“华盛顿前排”。您应该在您的实现中限制这一点。
https://stackoverflow.com/questions/31918374
复制相似问题