Scrapy是否会使用规则抓取所有链接?

时间:2016-03-24 08:16:31

标签: python-2.7 scrapy

代码来源:http://mherman.org/blog/2012/11/08/recursively-scraping-web-pages-with-scrapy/#rules 我是python和scrapy的新手。我搜索了递归蜘蛛并找到了它。

我有几个问题:

以下是如何运作的?它只是从页面中获取href链接并将其添加到请求队列中吗?

网页的哪一部分可以进行scrapy抓取?

以下代码是否从网页上抓取了所有链接?

假设我想抓取并下载此网站http://downloads.trendnet.com/

中的每个文件

我可能会这样做的方法是抓取本网站上的每个链接并检查URL的内容标题并下载(如果它是文件)。这可行吗?

对不起,如果这是一个糟糕的问题......

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from craigslist_sample.items import CraigslistSampleItem

class MySpider(CrawlSpider):
    name = "craigs"
    allowed_domains = ["sfbay.craigslist.org"]
    start_urls = ["http://sfbay.craigslist.org/search/npo"]

    rules = (
        Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="button next"]',)), callback="parse_items", follow= True),
    )

    def parse_items(self, response):
        hxs = HtmlXPathSelector(response)
        titles = hxs.xpath('//span[@class="pl"]')
        items = []
        for titles in titles:
            item = CraigslistSampleItem()
            item["title"] = titles.xpath("a/text()").extract()
            item["link"] = titles.xpath("a/@href").extract()
            items.append(item)
        return(items)

1 个答案:

答案 0 :(得分:0)

我认为RTFM在这里真的很适用,但是给你一个简短的答案:

关于给出的示例

rules = (
        Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="button next"]',)), callback="parse_items", follow= True),
    )

你问它抓什么。它只会抓取您在规则下设置的内容。这意味着您的机器人每次只抓取下一页。对于它找到的每个页面,它执行:callback = parse_items。

def parse_items(self, response):
        hxs = HtmlXPathSelector(response)
        titles = hxs.xpath('//span[@class="pl"]')
        items = []
        for titles in titles:
            item = CraigslistSampleItem()
            item["title"] = titles.xpath("a/text()").extract()
            item["link"] = titles.xpath("a/@href").extract()
            items.append(item)
        return(items)

在这种情况下,parse_items的作用是检查列表中的条目。您可以通过xpath定义列表(如上面的titles = hxs.xpath('//span[@class="pl"]')所示)。对于列表中的每个条目(即for titles in titles:),它将文本和链接复制到项目中。然后它返回项目(也就是它已经完成)。

Praw_items是通过跟随下一个按钮为抓取工具找到的每个页面完成的。

在设置下,您可以添加DEPTH_LIMIT=3。在这种情况下,您的爬虫蜘蛛只会爬3深。

关于您发布的网站:

不,你不需要爬虫,因为没有多个页面。普通的基础蜘蛛就足够了。然而,爬虫可以工作,我会在下面显示一些内容。将规则设置为restrict_xpath(' // a',),然后按照页面上的所有链接进行操作。

确保您的item.py包含所有必需的项目。例如,下面指的是项目[" link"]。在你的item.py中,确保包含一个名为link(caps-sensitive)的项目,即确保line - link = Field() - 在那里。

在parse_items下,执行以下操作:

def parse_items(self, response):
        list = response.xpath('//a"')
        items = []
        for titles in list:
            item = [INSERT WHATEVER YOU CALLED YOUR ITEM]
            item["title"] = titles.xpath("/text()").extract()
            item["link"] = titles.xpath("/@href").extract()
            if ".pdf" in item["link"]:
                SEE COMMENT BELOW
        return(items)

您需要做的最后一点是检查项目管道的工作方式。它在您的项目中使用file_urls等。