原标题:送给喜欢看电影的你(三):爬虫篇

今天我接着讲《送给喜欢看电影的你》系列。之前提到,作为数据工作者,较常见的数据采集手段是爬虫,那么今天这篇文章我会详细讲一讲我如何在不断更新反爬虫策略的豆瓣上爬取电影数据,并将展示一些核心代码。

关于爬虫,需要强调以下两点。

关于第1点,我就不做太多解释了。总之一句话,不要恶意损坏公共资产,这是不道德的行为。

关于第2点,我记得第一次玩爬虫的时候,感觉太神奇了。刚写完代码,一执行,数据“唰唰唰”得写到了本地,整齐又美丽,甚至都能听到写数据的声音。没几分钟,就高兴不起来了。因为遇到了反爬虫,ban了我的IP。

如果想要自己的IP不被封,原理很简单,让爬虫的行为更像人类,但是这样的话就会大大衰减爬虫的速度,因为人类浏览网页的速度不会像机器那么快。

python中有个依赖包selenium,它可以模拟浏览器行为。为了不影响个人的正常生活时间,你可以将程序部署至VPS(Virtual Private Server 虚拟专用服务器)中,这样在你睡觉时程序也可以正常工作。

我用的是vultr,服务器在美国西雅图,将爬虫服务部署在了上面,访问国内的网站时,速度也不会太慢。

在使用selenium之前需要先安装chrome driver

在调用selenium时需要指定driver的存储路径:

由于使用VPS时没有图形界面,只有终端界面,所以在调用selenium时不可以开启图形界面。

这样,就可以无界面得开启chrome了。

对于爬取内容,之后的步骤和普通的爬虫一样。我们可以将页面上的内容转为html源码,通过BeautifulSoup来分析处理

通过分析html,可以将目标内容找出。

对于存储数据这块,根据个人需求。有的朋友想直接存储成文本文件,可以通过pandas中的to_csv直接写入硬盘,为了读取快速,可以存储为hdf5格式。我将数据直接存储在了mysql中,一是为了查询方便,二是为了数据转移方便,当然更多的是为了后面的应用,需要用到数据库做数据处理。

例如我在mysql中创建了一张表,对应着我将爬取的内容:

将数据存储至mysql中:

当然,在入库之前,需要先和mysql建立连接。这里要用到pymysql依赖包

通过上面的代码,已经可以开始爬取数据了。但是会有被封掉IP的风险,如何做得更像人类行为,将决定爬虫的执行能力。

首先,为了防止网络缓慢或者网络错误而不能够正常加载网页,可以自己定义一个retry函数。在遇错时尝试刷新网页:

在加载网页时可以这样调用:

当然,为了使你的行为更加像人类,这样操作还是不够的。尽量在每浏览完一页之后,停顿一些时间,再继续浏览。在这里,我每次都停顿了一个随机数:

time.sleep(self.time_sleep_base + np.random.ranf())

对于一些网页中事件,比如有些内容被隐藏了,需要用户点击按钮之后才可以显现出来。selenium在这方面做得非常好,它完全可以模拟人类行为,即使是鼠标点击事件。

例如,在爬取影评时,遇到一些影评内容被折叠了,但是我们仍想获取,需要用户先点击,在获取:

selenium中可以通过click函数来处理此问题:

为了使得自己的代码运行起来更像个程序,可以记录一些日志信息,也是为了方便之后更好地debug,呈现出的效果比如像这样:

展示代码:

由于我租用的VPS配置内存只有1个G,为了防止内存溢出,可以在每次爬取完一个类型的电影之后,kill掉所有与chrome相关的进程,重启一个driver,当然,这里需要你懂一些shell命令:

刚才我提到可以让程序在睡觉时正常运行,当然最好选在服务器不太忙的时段,比如在凌晨。可以通过linux中的定时任务来处理这件事:

有关程序中的核心代码基本就是以上这些了。当然有一些环境的搭建、BeatfulSoup的使用我没有详细介绍,不过网上相关资料会很多。有哪些地方不懂的也可以和我讨论。

下篇我们继续。

相关文章