Home >  > Scrpy的第二个爬虫(爬取博客)

Scrpy的第二个爬虫(爬取博客)

0

学习目标:

  • 通过抓取一个博客的标题,进一步了解利用Scrapy抓取数据的流程


测试环境:
win7 旗舰版
Python 2.7.14(Anaconda2 2 5.0.1 64-bit)

一、创建项目
进入“Anaconda Prompt”的窗口,输入以下命令:

scrapy startproject scrapyspider

二、编写第一个爬虫(Spider)

在scrapyspider/spiders目录下建立一个名为blog_spider.py的文件。

Snap253

输入以下代码:

from scrapy.spiders import Spider


class BlogSpider(Spider):
    name = 'woodenrobot'
    start_urls = ['http://woodenrobot.me']

    def parse(self, response):
        titles = response.xpath('//a[@class="post-title-link"]/text()').extract()
        for title in titles:
            print title.strip()

其中:

titles = response.xpath('//a[@class="post-title-link"]

这句的意思是选取所有具有class="post-title-link"属性的A元素的值。

Snap256

关于xpath的介绍,可以看这里

Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。

其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。

为了创建一个Spider,您必须继承 scrapy.Spider 类, 且定义以下三个属性:

name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

三、启动爬虫

进入项目所在根目录,即scrapyspider路径下,运行:scrapy crawl woodenrobot命令。

Snap254

就可以看到爬虫抓取当前页所有文章标题了。

Snap255

四、抓取多页内容

将start_urls的那一段代码改成:

start_urls = [
        'http://woodenrobot.me/page/2/',
        'http://woodenrobot.me/page/3/',
    ]

即使我们没有加以下代码:

for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

parse()也会自动处理每个URLs的返回数据,因为parse() 是Scrapy默认的callback方法,如果没有指定callback的方法,就自动使用parse()。

运行的效果图:
Snap257

五、保存数据

将for title in titles后面的代码改成:

        for title in titles:
            yield {
                'Title': title,
            }

然后执行下面的命令,就会在项目的根目录下面,生成一个CSV文件:

scrapy crawl woodenrobot -0 woodenrobot.csv

将最后面的csv改成json,则可以生成Json文件。

不过由于编码的原因,CSV、Json文件打开都是乱码。

csv文件用记事本打开反而不是乱码了。

Snap258

原载:蜗牛博客
网址:http://www.snailtoday.com
尊重版权,转载时务必以链接形式注明作者和原始出处及本声明。

本文暂无标签

发表评论

*

*