最近整理一个爬虫系列方面的文章,不管大家的基础如何,我从头开始整一个爬虫系列方面的文章,让大家循序渐进的学习爬虫,小白也没有学习障碍.
爬虫篇| Python最重要与重用的库Request
爬虫篇 | Python爬虫学前普及
基础篇 | Python基础部分
昨天说了Requests库,今天来上手爬虫了.
爬虫的抓取方式有好几种,正则表达式,Lxml(xpath)与BeautifulSoup,我在网上查了一下资料,了解到三者之间的使用难度与性能
三种爬虫方式的对比。
抓取方式 | 性能 | 使用难度 |
---|---|---|
正则表达式 | 快 | 困难 |
Lxml | 快 | 简单 |
BeautifulSoup | 慢 | 简单 |
这样一比较我我选择了Lxml(xpath)的方式了,虽然有三种方式,但肯定是要选择最好的方式来爬虫,这个道理大家都懂,另外有兴趣的朋友也可以去了解另外两种爬虫方式!
好了现在来讲讲xpath
由于Xpath属于lxml模块,所以首先需要安装lxml库,老办法直接在file-->setting---project interpreter 一键添加lxml库。
xpath简单用法
from lxml import etree
s=etree.HTML(源码) #将源码转化为能被XPath匹配的格式
s.xpath(xpath表达式) #返回为一列表,
基础语法:
// 双斜杠 定位根节点,会对全文进行扫描,在文档中选取所有符合条件的内容,以列表的形式返回。
/ 单斜杠 寻找当前标签路径的下一层路径标签或者对当前路标签内容进行操作
/text() 获取当前路径下的文本内容
/@xxxx 提取当前路径下标签的属性值
| 可选符 使用|可选取若干个路径 如//p | //div 即在当前路径下选取所有符合条件的p标签和div标签。
. 点 用来选取当前节点
.. 双点 选取当前节点的父节点
学以致用,方能让我们能快速掌握xpath语法功能。
我们这次需要爬取豆瓣音乐前250条
打开豆瓣音乐:https://music.douban.com/top250
获取单条数据
1.获取音乐标题
打开网址,按下F12,然后查找标题,右键弹出菜单栏 Copy==> Copy Xpath
这里我们想获取音乐标题,音乐标题的xpath是:xpath://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/a
# coding:utf-8
运行代码:
居然是空的。!!!
这里需要注意一下,浏览器复制的xpath只能作参考,因为浏览器经常会在自己里面增加多余的tbody标签,我们需要手动把这个标签删除
删除中间的/tbody后,是这样的,title = s.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div/a')
然后我们再运行代码。
得到:
说明标题被获取到了。
因为要获取标题文本,所以xpath表达式要追加/text()title = s.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div/a/text()')#因为要获取标题,所以我需要这个当前路径下的文本,所以使用/text()
又因为这个s.xpath返回的是一个集合,且集合中只有一个元素所以我再追加一个[0]
新的表达式:title = s.xpath('//*[@id="content"]/div/div[1]/div/table[1]/tr/td[2]/div/a/text()')[0]#因为要获取标题,所以我需要这个当前路径下的文本,所以使用/text(),再追加[0]
重新运行得到结果:
We Sing. We Dance. We Steal Things.
正是我们想要的标题。
2.获取音乐评分与评价人数
老办法,先用右键copy评分的xpath ://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/div/span[2]
复制评价人数的xpath://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/div/span[3]/text()
同样的我们要把tbody去掉,然后重新运行代码:
# coding:utf-8
得到:
We
3.获取音乐链接
copy标题的xpath,://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/a
想获取音乐连接href这里需要,获取这个标签属于,/@xxx可以提取当前路径标签下的属性值//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[2]/div/a/@href
代码:
# coding:utf-8
运行代码得到:
https:/
5.获取图片地址:
找到图片,复制他的xpath地址://*[@id="content"]/div/div[1]/div/table[1]/tbody/tr/td[1]/a/img
运行代码:
# coding:utf-8
老套路:
得到结果:
//music.douban.com/subject/2995812/
但是这只是获取了一条数据,如果获取多条数据呢?
获取多条数据
我们再看第二条数据,第三条数据,第四条数据
得到他们的xpath:
# coding:utf-8
得到:
We Sing. We Dance. We Steal Things.
对比他们的xpath,发现只有table序号不一样,我们可以就去掉序号,得到通用的xpath信息:
运行代码:
# coding:utf-8
得到:
We Sing. We Dance. We Steal Things.
Viva La Vida
华丽的冒险
范特西
後。青春期的詩
是时候
Lenka
Start from Here
旅行的意义
太阳
Once (Soundtrack)
Not Going Anywhere
American Idiot
OK
無與倫比的美麗
亲爱的...我还不知道
城市
O
Wake Me Up When September Ends
叶惠美
七里香
21
My Life Will...
寓言
你在烦恼什么
其它的信息如:链接地址,评分,评价人数都可以用同样的办法来获取,现在我同时获取多条数据,因为每页数据是25条,所以:
完整代码如下:
# coding:utf-8
得到:
一大批数据了,我就不展示了。有兴趣可以直接copy代码运行.,注意你得装上lxml与requests库.
我们也发现了问题每一个xpath路径特别长,能不能精简一下呢?
5. 精简一下xpath路径
hrefs = s.xpath(
观察发现获取几个关键字段的xpath前缀都是 //*[@id="content"]/div/div[1]/div/table/tr
那我能不能把这些东西提出来呢,让后面的不同的自己去追加,另外这样写也不用管每个页面到底有多少条数据,只管查就行了。所以代码做了一下精简。
'https://music.douban.com/top250'
得到的结果和之前是一样的。
但是,但是,这只是一个页面的数据,我现在想爬取多个页面的数据,怎么办呢?
获取个多页面数据.
观察一下翻页路径:
https://music.douban.com/top250?start=0
https://music.douban.com/top250?start=25
https://music.douban.com/top250?start=50
有没有发现页面只是后面start参数发生了改变,且增长为每次25,并且250条数据正好是10页。
所以我可以遍历这个页面。
代码:
for i
得到:
//music.douban.com/top250?start=0
正是自己要的结果。
好了最后我们把代码拼装在一起,并注意每个方法的用途。
完整代码
# coding:utf-8
如果你觉得文章还不错,请大家点赞分享下。你的肯定是我最大的鼓励和支持。
【完】如果觉得有料,来个在看,让朋友知道你越来越优秀了
说句题外话,有不少人想加我微信,看我朋友圈的每日分享,我姑且放出来,但名额有限,先来先得。我的朋友圈不止有技术分享,更有我的日常感悟,还有我个人商业思维观点 速速扫码添加!
扫码添加,备注:公号铁粉
推荐阅读
爬虫篇 | Python爬虫学前普及
爬虫篇 | 认识Python最最最常用语重要的库Requests
基础篇 | Python基础部分小结,推荐收藏
讲真,做Python一定不要只会一个方向!
![98b075f88790c735890389f99278f5bb.png](https://i-blog.csdnimg.cn/blog_migrate/57dd46da69c475fc6d42a0f25da5d085.png)