其实,一开始学python的时候,我是冲着数据处理分析去了,那个pandas什么的。后来,发现爬虫挺好玩,可以解决纯手工采集网上数据的繁琐问题,比如我用的比较多的爬取taptap某游戏评价内容、某视频网站某剧的弹幕、某评的店铺信息、某牙主播信息等等。
关于爬虫,我也只会一些比较基础的操作,不过个人经验上感觉这些基础基本可以满足比较常规化的需求。对于进阶的爬虫技巧,大家在了解熟悉爬虫基础后自然会有进阶学习的思路与途径。
接下来,我们进入主题吧~
把爬虫的过程模块化,基本上可以归纳为以下几个步骤:
当我们有一个目标网站,有时候会发现对于静态网页,我们只需要把网页地址栏中的URL传到get请求中就可以直接取到网页的数据。但如果这是动态网页,我们便无法通过简单的传递网页地址栏的URL给get请求来获取网页数据,往往这个时候,我们进行翻页的时候还会发现网页地址栏中的URL是不会发生变化的。
接下来,我们来分别介绍这两种情况下如何获取真实的页面数据URL地址。
对于静态网页来说,其实网页地址栏中的URL就是我们需要的。
对于动态网页来说,我们一般可以通过以下几个步骤找到真实URL地址:
为了便于找到真实的URL地址,我们可以在开发者模式中找以下截图中的几点,preview是预览结果,可以便于我们进行匹配定位具体的Name。
虎牙星秀区
当我们定位到具体的Name后,右侧选择Headers可以查看到请求网页需要的相关参数信息,而且比较好拟清其变化规律。以虎牙星秀为例,其真实URL地址及变化规律如下:
基础 url 地址如下:
请求参数parames如下:
真实URL地址
当我们确定了真实数据的URL后,这里便可以用requests的get或post方法进行请求网页数据。
我们得到的是一个Response对象,如果我们想要获取网页数据,可以使用text或content属性来获取,另外如果获取的网页数据是json格式的则可以使用Requests 中内置的 **json()**解码器方法,助你处理json 数据。
对于一些动态网页,请求的网址是基础url和关键字参数组合而成,这个时候我们可以使用 params 关键字参数,以一个字符串字典来提供这些参数。
通常,你想要发送一些编码为表单形式的数据——非常像一个 HTML 表单。要实现这个,只需简单地传递一个字典给 data 参数。你的数据字典在发出请求时会自动编码为表单形式:
很多时候你想要发送的数据并非编码为表单形式的。如果你传递一个 string 而不是一个 dict,那么数据会被直接发布出去。
此处除了可以自行对 dict 进行编码,你还可以使用 json 参数直接传递,然后它就会被自动编码。
在模拟请求时,如果不设置请求头的话是比较容易被网站发现是来自爬虫脚本,一些网站会对这种模拟请求进行拒绝。因此我们可以简单设置一下请求头做伪装,一般是设置浏览器。
其实,对于请求头还可以设置很多参数,具体大家可以在实际爬虫过程中在开发者模式看看里面的请求头模块进行分析处理。
虎牙星秀请求头
响应码分为五种类型,由它们的第一位数字表示:1xx:信息,请求收到,继续处理 2xx:成功,行为被成功地接受、理解和采纳 3xx:重定向,为了完成请求,必须进一步执行的动作 4xx:客户端错误,请求包含语法错误或者请求无法实现 5xx:服务器错误,服务器不能实现一种明显无效的请求
上面有提到我们请求的网页数据有Html源码文本或者是json字符串文本,两者的解析方式不同。以下我们分别进行简单说明,大家在实际操作中视情况而定即可。
对于网页html文本来说,这里介绍Beautiful Soup、xpath和re正则表达式三种解析方法。
贝壳二手房
首先安装pip install beautifulsoup4。
房源名称
获取房源的名称的代码如下:
房源其他信息大家可以自己处理,强化学习!
XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言。
首先安装lxmlpip install lxml。
常见的规则如下:
表达式
描述
nodename
选取此节点的所有子节点
从当前节点选取直接子节点
//
从当前节点选取子孙节点
选取当前节点
..
选取当前节点的父节点
选取属性
右键可获取xpath
通过copy获取的xpath://*[@id="beike"]/div[1]/div[4]/div[1]/div[4]/ul/li[1]/div/div[1]/a
其他房源信息,大家可以自行处理,强化学习!
json文本解析
如此解析后得到的数据就是字典,然后我们在看看字典中哪些字段是我们需要的,取出即可。
当我们获取了到想要的数据后,便可以写入本地了。
对于文本类数据,可以通过csv模块或pandas模块进行写入到本地csv文件或excel文件;同时也可以用pymysql模块写入到数据库或者sqlite写入到本地数据库。
对于视频或者图片,可以open一个文件然后写入二进制内容后保存本地亦可。