![ca31fff295cceb9317f488e564dab6d7.png](https://i-blog.csdnimg.cn/blog_migrate/dd86e1c099fcd657f6efa92773eb4252.png)
1
爬取过程爬虫向目标网站发出请求(request),服务器接收到请求后,根据请求参数发回响应信息(response)。一般浏览器在收到服务器响应后,会将响应解析出来展现给用户——也就是通常咱们直观看到的网页。而爬虫所要做的,就是将收到的服务器响应进行分析和处理,提取用户所需要的数据。
常用的请求方式有GET和POST,其中的差别可以简单地认为POST请求是将请求内容放入的请求体(request body)中。请求最终会拼接成如https://www.baidu.com/s?wd=搜索内容这样的形式,大家可以测试一下修改“wd=”后面的内容,看看浏览器会返回什么结果。
此外,一个请求还需要包含一个请求头,一个通常的请求头内容为:
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML,likeGecko)Chrome/63.0.3239.108 Safari/537.36"
其中标识了所使用的浏览器内核名称及其版本。在使用浏览器访问网页时,浏览器在发送请求时会自动加入这个请求头,以说明自己浏览器的身份;而当我们使用爬虫发出请求时,若不加请求头,则服务器有可能会将爬虫当做一个非法用户而拒绝响应。
在Python中,发出请求使用的是requests库,其安装十分简单,在已经安装了包管理器pip的前提下,使用如下命令安装: pip3 install requests 其使用方法也非常简单,我们以Bilibili的全站排行榜页面 https://www.bilibili.com/ranking为例:![549d79ed351e04110e1e47fd6dcbb8c8.png](https://i-blog.csdnimg.cn/blog_migrate/a874a558d01000d4d4f1ac282a79a26c.png)
其核心就是调用requests.get()函数,指定要访问的地址和(虚假的)请求头,执行以上代码后即可看到屏幕上打印了如下图的网页内容:
![79f00aa7062b2cce7094297f9b06cf84.png](https://i-blog.csdnimg.cn/blog_migrate/f53411154c455c885247be25a47f7cb8.png)
这里就需要简单介绍以下网页的基本架构了。
2
了解网页结构
K E E P
S M I L E
![4125938a7ab86dea3998d8f929c56a5f.png](https://i-blog.csdnimg.cn/blog_migrate/57766d23d26e691e364f180125a6eabe.jpeg)
![f0f422060f19e4dd052ff01c769ffe96.png](https://i-blog.csdnimg.cn/blog_migrate/2cf4448af94f1fdf2d9a99b1f4ab4c4b.jpeg)
虽然目前众多的前端框架和技术层出不穷,但是对于浏览器而言,可以进行展示的网页一般还是由三部分组成,分别是超文本标记语言(HTML)、层叠样式表(CSS)及脚本语言(Javascript),其中HTML相当于页面的骨架,CSS决定了页面的外观和样式细节,而Javascript则确定了页面具有什么样的功能(如提交表单等)。
HTML是由HTML标签所构成的,常用的标签有:
.. 表示标记中间的元素是网页;
..
表示段落;..表示列表;..表示图片;
..
表示标题;.. |
..表示超链接。
了解HTML标签的含义会对后续的爬虫内容解析过程非常有意义,从页面数据中分离和解析有用数据,其实就是从HTML标签的正确的层次中找到正确的数据的过程。
3
数据的提取与解析
K E E P
S M I L E
![30a6d565c85f5452420a7f30841017ba.png](https://i-blog.csdnimg.cn/blog_migrate/ee5a93751e34cf9c37094717a61df26c.jpeg)
如果将响应页面数据作为一整个文本来看,那么在数据查找时比较专业的做法是使用正则表达式进行匹配,但是正则表达式规则繁多,编写复杂且易出错,对于新手来说十分不友好。前面我们介绍过,HTML有着很明确的由标签组成的层级关系,那么我们能否借助其结构和属性进行数据提取呢?答案是肯定的。
在Python中,我们有多个解析库可供使用,如XPath、BeautifulSoup等,本文将以XPath为例进行介绍。
XPath同样可以使用pip进行安装:
pip3 install lxml
我们使用XPath进行HTML标签的路径选择,其常用的规则如下:
![e03cf2d5aaefabaec317030f8e9ca6e3.png](https://i-blog.csdnimg.cn/blog_migrate/dd80604236419bede12f650c9f2b37c0.png)
比如说我们希望选取如下代码中的链接到link3.html页面中的链接名称。
![86dc31b3a164e11f498c4c158ee8a93d.png](https://i-blog.csdnimg.cn/blog_migrate/ecd366b999d3579bd317e323f754621a.png)
其选择器应为:
//div//ul//li//a[@href="link3.html"]/text()
其中a[@href="link3.html"]就是匹配a标签中href的属性名,text()是获取节点中的文本,执行后的结果就是a节点中的文本third item。
接下来我们在做一个实战,还是以Bilibili的全站榜为例,爬取当日上榜的所有视频名,用Chrome浏览器打开
https://www.bilibili.com/ranking
然后按下F12打开浏览器工具,然后按下元素选取按钮选取一个排名的标题,如下图:
![5b2388ab7efff55aeff075a68614b860.png](https://i-blog.csdnimg.cn/blog_migrate/3080d83932bfdcd0fd405011789a350a.png)
我们可以看到右侧浏览器工具会显示我们选取的这个标题在HTML中的位置,观察这行代码:
妹子被告白后当场牺牲【阅片无数49】
我们可以看到其标题是放在了a标签中,其父节点则是多个div标签和列表标签ul等。这是不是意味着我们在路径选择时,需要将其所有父节点都写出来呢?答案是否定的。参考我们前面所介绍的内容,“//”表示的是子孙节点,而包含标题的a标签则带有一个明显的属性:class=”title”,那么我们只要找到页面中所有含有这个特殊属性的a标签即可完成我们的任务。
完整代码如下:
![81d981fc902cf553911d6e5f912fb3dd.png](https://i-blog.csdnimg.cn/blog_migrate/21742d27f0e46fbe7d179499d2047b39.png)
其中get_one_page()是我们将第一步获取页面封装成了一个可调用的函数,整段代码中的核心就是我们使用的选择器
//a[@]//text()
以上代码执行后的部分结果为:
![83cdd5d8040a401a3f8d230505253ea0.png](https://i-blog.csdnimg.cn/blog_migrate/5dff997998f4b0f88262f8988191848a.png)
对比我们当日的结果,显然是符合的。
4
数据存储
在完成数据爬取后,我们最后一步要考虑的就是如何将爬取的数据保存下来。保存的形式有很多种,如纯文本形式的存储,可以使用json、csv等方式;还可以保存到数据库中,其中数据库还分为关系型数据库,如MySQL、SQL Server等,还有非关系型数据库,如Redis、MongoDB等。这些存储方式在Python中都有其对应的库可以直接拿来使用,在此不再赘述。
总结
本文对爬虫原理和如何使用Python进行简单爬虫操作进行了论述,当然文中所述的爬虫方法也仅仅是冰山一角,实际进行爬虫操作时还会遇到非常多的问题,如有的页面使用Javascript动态加载的结果,其数据来源也多种多样;有的数据需要模拟提交登录和其他请求;有的网站使用了反爬虫技术等等,这些都需要我们在具备了更多的网络知识和技术后加以实践才能解决。希望大家通过本文能对爬虫知识有一个初步了解,以此为契机多多学习,多多实践哦~END
![0fa54e9ade5745238d6ffe9944864244.png](https://i-blog.csdnimg.cn/blog_migrate/aab001d68e01d225bf1ad1f601f64888.png)
![6d2fa00436e842a7ae371b2515b16038.png](https://i-blog.csdnimg.cn/blog_migrate/7552371b9c015592a84a02bd58606fc7.png)
点击蓝字"TRFund"
关注这个多彩的世界
![6118329f6d790b844649b4c83c6a16fb.gif](https://i-blog.csdnimg.cn/blog_migrate/f744adec2c366b03985de3bb06ee9dba.gif)
![f108abc7bde2d9a452b7fc406392f824.gif](https://i-blog.csdnimg.cn/blog_migrate/b5fdda9849aa64542a719dcfd4df431e.gif)
![7c36d1f9a159593d50f23dcd8588ef5a.png](https://i-blog.csdnimg.cn/blog_migrate/1ffdb1478c527fbe6f739f03ba436e3a.png)
![6118329f6d790b844649b4c83c6a16fb.gif](https://i-blog.csdnimg.cn/blog_migrate/f744adec2c366b03985de3bb06ee9dba.gif)
![f108abc7bde2d9a452b7fc406392f824.gif](https://i-blog.csdnimg.cn/blog_migrate/b5fdda9849aa64542a719dcfd4df431e.gif)
![0fa54e9ade5745238d6ffe9944864244.png](https://i-blog.csdnimg.cn/blog_migrate/aab001d68e01d225bf1ad1f601f64888.png)
文字:Macro song
编辑:Haiyan