我其实很喜欢造轮子,一直没用过爬虫框架写爬虫。虽然知道爬虫很简单,scrapy框架也不难,但是在舒适区呆久了,真的不想学新东西,用新知识写爬虫。 今天我不止用新框架scrapy写爬虫,而且我还要使用sqlite数据库来存储数据,今天算是离开舒适区最远的一次尝试。 今天写的是知乎Live的爬虫,用平常的舒适区写法,无非requests、beautifulsoup、csv文件。今天为了用scrapy+sqlite3写出这个爬虫,我用了三天时间,学习理解scrapy框架,调试了大概七八小时才正确的将解析的数据存入数据库中。过程其实一点也不苦逼,挺好玩的,看到存入数据库,真的很激动。 scrapy是一个用起来很方便的框架,省去了造轮子,只需要在需要的地方秀秀改改缝缝补补就可以写爬虫。优点是方便,缺点是如果你对写爬虫逻辑不是很清晰的话,用多了scrapy你反而不太会自己造轮子。 上面是我看网上对爬虫框架的解读,我直接评判的scrapy。仅一家之言,勿喷。下面我们直接在实战中开始知乎live爬虫项目。 一、知乎Live抓包分析打开知乎Live网址
打开浏览器开发者工具(F12) 我们直接拖动页面向下滚动,Network中就出现了很多网址和数据。 其中如下图的网址 数据与网页直播的title对应上了。说明找到了对应的网址。而且这数据还是json格式,使用起来特别方便。 网址如下
为了节约时间,今天我就只爬live标题和演讲者。 二、创建scrapy项目打开终端命令行输入 scrapy startproject livespider [项目存放的文件夹的路径] 我在桌面上首先新建了一个scrapysqlite文件夹,然后才在终端创建livespider,项目存放于scrapysqlite文件夹中 现在我们用Pycharm打开livespider项目 现在我们看下打开后的文件目录 三、livespider项目解读上图打开的项目目录,都是scrapy startproject livespider这个命令行回车后自动生成的。
四、创建spider我们要在spiders文件夹里创建一个zhihu.py 爬虫(spider)。我们可以通过点击Pycharm下方的Terminal,输入 scrapy genspider zhihu zhihu.com 生成zhihu.py文件,爬虫允许爬的域名为zhihu.com。 五、settings.py设置现在我们要开始对项目进行全局配置。 打开settings.py文件,将 ROBOTSTXT_OBEY = True
改为(不遵守机器人协议,方便爬取数据)
ROBOTSTXT_OBEY = False 取消DOWNLOAD_DELAY的注释符#,并赋值为1。 此处为限制爬虫的访问网站速度。 取消DEFAULTREQUESTHEADERS的注释,并填写zhihu页面解析时的headers请求头 DEFAULT_REQUEST_HEADERS = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36',
'Authorization':'oauth 8274ffb553d511e6a7ffffff'
} 这里注意,经过测试发现,如果没有Authorization,只有useragent,是无法正常访问知乎网站的。所以自己查找并填写。 取消ITEM_PIPELINES的注释符# 六、items.py配置因为今天为了省事,我们就只爬知乎Live的标题和演讲者。 items.py功能相当于爬虫解析出的数据需要一个结构化的容器封装,方便传递给pipelines使用。 形象一点的比喻就是,items将数据打包,方便运输。本项目中的zhihu.py爬虫将网站中得到的数据通过items的形式打包数据,传递给pipelines水管,并将数据流入数据库保存。 打开items.py文件,将文件修改为 from scrapy import Field,Item
class LivespiderItem(Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = Field()
speaker = Field() 现在开始我们先创建好数据库,然后在配置pipelines.py Pycharm实际上可以可视化操作sqlite。 七、SQLite在PyCharm中的使用7.1配置SQLite步骤如下:
7.2 创建sqlite数据库选择scrapy创建好的livespider项目路径,并将数据库命名为zhihulive.db ,点击apply和ok 7.3 创建表按照图中的123,依次点击Database 、zhihulive.db 、main 点击图中红框,先设置Table表名为LiveTable。 点击加号,依次设置了id为主键整数型自增序号。title和speaker均为TEXT格式数据 创建好数据库和表,后面我们就要在pipeline.py中操作数据。 八、pipelines.py配置打开pipelines.py你会看到如下默认代码 import sqlite3class LivespiderPipeline(object):
def process_item(self, item, spider):
pass 我们应该首先知道,pipelines是为了将数据存入数据的。
依次对应的scrapy默认的功能函数为 def open_spider(self,spider):
passdef process_item(self, item, spider):
#写入数据库或数据文件
return item 根据上面的知识,我们完成了下面的pipelines.py 的配置。注意format传递值的时候,前面的变量是要用 '{}'。 import sqlite3 九、spider的书写前面所有的准备都是为了这一刻,我们能够将爬到的数据存起来。现在我们开始爬虫的逻辑,也是最关键的部分。spiders文件夹下的zhihu.py 在ZhihuSpider类中,scrapy框架有默认的请求函数start_requests ,该函数对网址发起请求,yield方式返回的相应数据传递给该ZhihuSpider类中的parse函数解析。 9.1 start_requests函数callback是回调,也就是说start_requests得到的网页数据要传输给parse函数解析。 def start_requests(self):
starturl = 'https://api.zhihu.com/lives/homefeed?limit=10&offset=10&includes=live'
yield Request(url=starturl, callback=self.parse) 9.2 parse函数parse函数负责解析数据,将数据以item形式封装,并以yield方式传输给pipelines,最终写入数据库。 yield其实很像return,只不过,return后会结束函数。而yield的函数相当于生成器,返回结果后并不直接结束函数,而是保留状态,下次运行函数会按照上次的位置继续迭代下去。 from scrapy import Spider,Request 全部写好了。现在在Pycharm终端Terminal中输入 scrapy crawl zhihu 开始愉悦的爬数据,而且还能用Pycharm看到数据库中的数据 这部分写的很粗糙,不懂的可以反复看我的视频。 苹果用户打赏可扫码链接: https://pan.baidu.com/s/1qYhZgle 密码: 59ku |
|