2012-04-15 147 views
0
from scrapy.spider import BaseSpider 
from scrapy.selector import HtmlXPathSelector 

class DmozSpider(BaseSpider): 
    name = "dmoz" 
    allowed_domains = ["dmoz.org"] 
    start_urls = [ 
     "www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
     "www.dmoz.org/Computers/Programming/Languages/Python/Resources/" 
    ] 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     sites = hxs.select('//ul/li') 
     for site in sites: 
      title = site.select('a/text()').extract() 
      link = site.select('a/@href').extract() 
      desc = site.select('text()').extract() 
      print title, link, desc 

这是我的代码。我想要大量的URL来循环使用。那么我如何应对这些?我确实在那里放了多个网址,但是我没有得到它们的输出。有些网址停止响应。那么我怎么才能使用这段代码来获取数据呢?从网站抓取多个网页

回答

0

您刚刚发布的代码来自tutorial。你应该做的是实际上读取的整个文档,尤其是basic concept部分。你基本上想要的是crawl spider,你可以在其中定义蜘蛛将遵循和处理你的给定代码的规则。

为了与例子引用文档:

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item 

class MySpider(CrawlSpider): 
    name = 'example.com' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://www.example.com'] 

    rules = (
     # Extract links matching 'category.php' (but not matching 'subsection.php') 
     # and follow links from them (since no callback means follow=True by default). 
     Rule(SgmlLinkExtractor(allow=('category\.php',), deny=('subsection\.php',))), 

     # Extract links matching 'item.php' and parse them with the spider's method parse_item 
     Rule(SgmlLinkExtractor(allow=('item\.php',)), callback='parse_item'), 
    ) 

    def parse_item(self, response): 
     self.log('Hi, this is an item page! %s' % response.url) 

     hxs = HtmlXPathSelector(response) 
     item = Item() 
     item['id'] = hxs.select('//td[@id="item_id"]/text()').re(r'ID: (\d+)') 
     item['name'] = hxs.select('//td[@id="item_name"]/text()').extract() 
     item['description'] = hxs.select('//td[@id="item_description"]/text()').extract() 
     return item 
+0

对不起,迟到的答复,我试图定义的规则,但这不是我的实际问题。我的问题是如何获得我提供给start_urls的所有页面的输出?我只从第3-4页获得输出到我的.csv文件中。我有将近20页来刮。那我该怎么做呢?刮这些3-4页后,我的程序停止从服务器接收答复。 – Nits 2012-05-19 05:12:05

1

你的代码看起来不错,但你确定start_urls不应与http://

start_urls = [ 
    "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", 
    "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" 
] 

UPD开始

start_urls是scrapy开始的url列表。通常它有一个或两个链接。很少。 此页面必须具有相同的HTML结构,因为Scrapy蜘蛛以相同的方式处理它们。

看看我是否在start_urls中放置了4-5个url,它给出的输出结果为第一个2-3 url。

我不相信这是因为scrapy并不关心有多少链接是start_urls列表。

但它停止响应,并告诉我如何实现这个GUI。

Scrapy有debug shell来测试你的代码。

+0

嗯看着答案的简单性我不太确定我是否理解正确的问题。我认为你的答案可能比我的更适合,但我仍然留下它,因为我认为OP可能也在寻找爬行过程本身。 – DrColossos 2012-04-15 13:27:50

+0

我不介意,但'OP'是什么? =) – San4ez 2012-04-15 13:31:32

+0

这意味着“Opriginal海报”;) – DrColossos 2012-04-15 14:09:44