Python每日一记70>>>基于lxml库与Xpath语法的爬虫实践
之前的学习中其实已经跳过了基于lxml库与Xpath语法的爬虫,认为使用soup就能解决问题,但是确实发现需要学习一下lxml库与Xpath语法的爬虫。因为后面的书中有反复使用这个方法,并且有时也确实发现soup比较慢。
本来前两天就在打算写这个文章,但是按照书上的方法始终觉得不对劲,于是自己进行了钻研,用了其他方法。
关于lxml库与Xpath语法的爬虫,请参考一下链接,这里只提醒一点,不要盲目的复制xpath,要有自己的想法,自己修改合适的语法。
https://www.cnblogs.com/zhangxinqi/p/9210211.html
接下来用实例爬取小猪短租的北京地区的房价
其他就不过多解释,只是说明一下xpath的部分:
最初我们复制出来的价格的xpath是://[@id=“page_list”]/ul/li[1]/div[2]/div[1]/span/i
但是因为这是一个特定的价格xpath,我们再看看另外一个价格xpath://[@id=“page_list”]/ul/li[2]/div[2]/div[1]/span/i
其中的差异在哪里呢?就是li[]
其实仔细观察下面的图,就能发现其路径就是//[@id=“page_list”]/ul/li/div[2]/div[1]/span/i,这样就能找到每一页所有的价格。
再仔细观察我们可以发现li后面的其实应该是div即可,而不是div[2],代表第二个div,因为li后面的子节点就只有div,无所谓第几个div
因为我们最终使用//[@id=“page_list”]/ul/li/div/div[1]/span/i/text(),也可以达到目的,注意我们最后加上了/text(),获取文本,否则得到的是类似于<Element i at 0x281f3637a88>的element对象。
以上是我自己想的方法,但是书上写的是用大循环–小循环的方式,也就是先找整个项目的路径,在循环细节的路径。
如下代码:
代码需要解释的部分:
房子整体信息xpath,初始复制的内容为//[@id=“page_list”]/ul/li[1],因为这只是一个特例,因为修改为//[@id=“page_list”]/ul/li即可代表每一个房子信息
然后房子的价格信息本来复制的是//[@id=“page_list”]/ul/li[1]/div[2]/div[1]/span/i,因为前面有了整体路径,因此修改为div[2]/div[1]/span/i即可,注意后面加上/text()以获得文本。
这样的循环操作是书中的方法,但是要自己理解xpath,并且进行适当的修改哦。
lxml库更加快,因为是C语言写的,但是相对于soup而言,要稍微难一点,综合小批量爬出可以使用soup,但是大批量的就建议使用lxml库了。
顺便提一下获取详细页的链接的代码如下: