Python笔记——scrapy爬取静态页面

@teddyluo  November 19, 2019

Scrapy 一直是 Python 爬虫入门学习的首选框架,这篇文章记录一下我的学习过程。

初始化项目

打开 cmd 定位到想要创建爬虫的路径
输入创建爬虫的命令

scrapy startproject awsl

然后我们就可以在该路径下看到一个名为『awsl』的文件夹,这个文件夹里面就是我们创建的爬虫。

打开文件夹发现其文件结构是这个样子的:

mySpider/ scrapy.cfg
    mySpider/ __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/ __init__.py ...

这些文件相当于一个模板,你可以在相关文件中修改相关代码来达到想要的效果。

我们爬取一个简单的 blog 网站并不需要更改很多配置,我们首先更改的是 items.py,这个文件用于定义结构化数据字段,用来保存爬取到的数据性。打开 items.py ,构建 item 模型:

import scrapy class

class awslItem(scrapy.Item): 
    name = scrapy.Field() 
    title = scrapy.Field() 
    info = scrapy.Field()

这个文件可以随时修改,以后想要爬更多的资料(例如图片等)就可以再额外添加。

接下来我们在 cmd 中指定爬取的域名,在这里我使用的是我自己的 blog 来练习爬虫(注意本期笔记仅限静态网站)

scrapy genspider luochengzhi "www.luochengzhi.top"

切换到工作目录下:

这样就在工作目录下生成了我的 spider

我们可以看到里面的代码

这段代码的含义是:

创建一个 luochengzhiSpider 的类
爬虫的名字是「luochengzhi」
爬取的页面是 luochengzhi.top(同时也从此页开始)

定义一个parse函数
    函数功能

至此,我们这个最简单的爬虫框架就算搭建完成。

编写爬虫

基本框架完成后,我们就可以着手 parse 函数的编写,这个函数就是爬虫的功能实现。

    def parse(self, response):
        filename = 'blog.html'
        open('filename','w').write(response.body)

这一段代码很简单,就是访问到 url 后产生一个 response,将其中的 body 文件写入「blog.html」文件中。

其实到这里一个简单的爬取单个页面的爬虫就完成了,可以试着运行了,当我们能够成功生成 html 文档后,可以通过修改 parse 函数来实现更多功能。

cmd 中输入以下命令运行爬虫:

scrapy crawl luochengzhi

调试

运行爬虫,出现了代码语法错误,遂在 luochengzhi.py 文件中修改

将引号问题去除掉后,重新运行爬虫:

INFO: Spider closed (finished)

出现这一段文字说明爬虫完整的运行了一遍,但是我们在文件夹内看到的 html 文件为 0kb(没有写入数据)

观察 cmd 中的信息我们发现一条信息

 DEBUG: Crawled (404) <GET http://luochengzhi.top/robots.txt> (referer: None)

这条信息说明我们被 robots 文件限制了,这个文件中规定了本站点允许的爬虫机器爬取的范围(比如你不想让百度爬取你的页面,就可以通过robot来限制),因为默认scrapy遵守robot协议,所以会先请求这个文件查看自己的权限。

scrapy 爬虫默认是遵守这个规则的,但是我们也可以不遵守,关闭scrapy自带的ROBOTSTXT_OBEY功能,在setting找到这个变量,设置为False即可解决。

再次运行爬虫:
这次我们遇到了这样一个错误:

既然是编码错误,我们修改 parse 函数的写入:

open(filename,'wb+').write(response.body)

运行爬虫,这次在运行过程中没有发现错误和 404,

文件夹内也出现了 html 文件:

看一下 html 文件:

这样一个爬取单个页面 html 的爬虫就完成啦~

下一节写如何从这个 html 中提取数据,感谢阅读。


添加新评论