2016-12-25 73 views
1

这里是我的Scrapy代码...Scrapy只爬行1页

import scrapy 

class NewsSpider(scrapy.Spider): 
name = "news" 
start_urls = ['http://www.StartURL.com/scrapy/all-news-listing'] 
allowed_domains = ["www.xxxxx.com"] 

def parse(self, response): 
    for news in response.xpath('head'): 
     yield { 
    'pagetype': news.xpath('//meta[@name="pdknpagetype"]/@content').extract(), 
    'pagetitle': news.xpath('//meta[@name="pdknpagetitle"]/@content').extract(), 
    'pageurl': news.xpath('//meta[@name="pdknpageurl"]/@content').extract(), 
    'pagedate': news.xpath('//meta[@name="pdknpagedate"]/@content').extract(), 
    'pagedescription': news.xpath('//meta[@name="pdknpagedescription"]/@content').extract(), 
    'bodytext': [' '.join(item.split()) for item in (response.xpath('//div[@class="module__contentp"]/*/node()/text()').extract())], 
     } 

    next_page = response.css('p a::attr(href)').extract_first() 
    if next_page is not None: 
     next_page = response.urljoin(next_page) 
     yield scrapy.Request(next_page, callback=self.parse) 

start_urls页面如下所示。这是一个非常简单的页面,并列出所有的3000链接/网址我想爬......

<html> 
<head> 
<div> 
<p><a href="http://www.xxxxx.com/asdas-sdf/kkm">Page 1</a></p> 
<p><a href="http://www.xxxxx.com/vdfvd-asda/vdfvf/dfvd">Page 2</a></p> 
<p><a href="http://www.xxxxx.com/oiijo/uoiu/xwswd">Page 3</a></p> 
<p><a href="http://www.xxxxx.com/jnkjn-yutyy/hjj-sdf/plm">Page 4</a></p> 
<p><a href="http://www.xxxxx.com/unhb-oiiuio/hbhb/jhjh/qwer">Page 5</a></p> 
<p><a href="http://www.xxxxx.com/eres/popo-hbhh/oko-sdf/ynyt">Page 6</a></p> 
<p><a href="http://www.xxxxx.com/yhbb-ytyu/oioi/rtgb/ttyht">Page 7</a></p> 
.......... 
<p><a href="http://www.xxxxx.com/iojoij/uhuh/page3000">Page 3000</a></p> 
</div> 
</head> 
</html> 

当我送Scrapy这个页面,它只是抓取第一个环节即http://www.xxxxx.com/page1和停止。 没有错误报告。看起来像这个递归部分是不是很工作...!那么,如何修改此代码以访问这3000个网址中的每个网址,然后获取一些特定字段。

我看到在其他一些类似的问题,人们使用“规则”和Scrapy的“LinkExtractor”对象?我不确定是否需要这些,因为我的要求非常简单。

任何帮助非常感谢。谢谢

+0

你能举一个例子网址是什么? next_page网址可能会通过过滤器进行过滤,因此您的next_page网址发现可能存在缺陷。通常情况下,您正在寻找名为next_page的网址或跟踪未超链接的网页的div。如果你能提供一个例子,它会更容易解释。 – Granitosaurus

+0

我找到了一个解决方案.....请参阅下面我更新的代码... – Slyper

回答

0

正如我怀疑,这确实是递归逻辑的一个缺陷。

下面的代码解决我的问题....

from scrapy.selector import Selector 
from scrapy.spider import BaseSpider 
from scrapy.http import Request 

class MySpider(BaseSpider): 
    name = "pdknnews" 
    start_urls = ['http://www.example.com/scrapy/all-news-listing/'] 
    allowed_domains = ["example.com"] 

    def parse(self, response): 
     hxs = Selector(response) 
     for news in response.xpath('head'): 
    yield { 
     'pagetype': news.xpath('.//meta[@name="pdknpagetype"]/@content').extract(), 
     'pagetitle': news.xpath('.//meta[@name="pdknpagetitle"]/@content').extract(), 
     'pageurl': news.xpath('.//meta[@name="pdknpageurl"]/@content').extract(), 
     'pagedate': news.xpath('.//meta[@name="pdknpagedate"]/@content').extract(), 
     'pagedescription': news.xpath('.//meta[@name="pdknpagedescription"]/@content').extract(), 
     'bodytext': [' '.join(item.split()) for item in (response.xpath('.//div[@class="module__content"]/*/node()/text()').extract())], 
      } 
    for url in hxs.xpath('//ul[@class="scrapy"]/li/a/@href').extract(): 
      yield Request(url, callback=self.parse) 

的最后两行所做的递归魔法......

0

每次请求http://www.xxxxx.com/page1这样的页面时,如果页面的页面栏不改变,您可能会在next_page = response.css('p a::attr(href)').extract_first()上得到相同的结果。 有更好的方式来做到这一点:

start_urls = ['http://www.xxxxx.com/page{}'.format(i) for i in range(the last page number)] 

这样,你不需要使用回调。

并且allowed_domains = ["www.xxxxx.com"]在此代码中不需要,这也许是另一个原因。

+0

嗨,谢谢你的回复。页面基地址确实会改变/变化。 – Slyper