今天来学习一下Lxml爬虫,收获蛮多的,我把过程分享给大家。希望大家也能和我一起学习python爬虫,丰富自己的知识量,万一那天你就用到了。
- etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法。
- XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的
- 如果想通过xpath获取html源码中的内容,就要先将html源码转换成_Element对象,然后再使用xpath()方法进行解析。
Xpath语法
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
以糗事百科(https://www.qiushibaike.com/text)为例,用Lxml爬虫爬取信息。
先讲一下如何选取节点
id = info.xpath('div[1]/a[2]/h2/text()')
鼠标定位在用户名这里,右击检查,会出现用户名的源代码,此时不要急于粘贴。我们选择Copy-Copy xPath,出现//*[@id="qiushi_tag_121201548"]/div[1]/a[2]/h2,而其中@id="qiushi_tag_121201548"]是精确定位,需要 删除,这样所有用户名都能被我们爬取。得到了上述代码。
from lxml import etree
import requests
url = 'https://www.qiushibaike.com/text/'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
res = requests.get(url,headers=headers)
html = etree.HTML(res.text)
infos = html.xpath('//div[@class="col1"]/div')
for info in infos:
id = info.xpath('div[1]/a[2]/h2/text()')
text = info.xpath('a[1]/div/span[1]/text()')
laugh = info.xpath('div[2]/span[1]/i/text()')
comment = info.xpath('div[2]/span[2]/a/i/text()')
print(id,text,laugh,comment)
最终结果如下:
爬取酷狗top500音乐(http://www.kugou.com/yy/rank/home/1-8888.html?from=rank)
import requests
from lxml import etree
import csv
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
def get_info(url):
res = requests.get(url,headers=headers)
html = etree.HTML(res.text)
infos = html.xpath('//div[@class="pc_temp_songlist "]/ul/li')
for info in infos:
try:
rank_1 = info.xpath('span[3]')[0]
rank = rank_1.xpath('string(.)').strip()
song_singer = info.xpath('a/text()')[0]
song = song_singer.split(' - ')[1]
singer = song_singer.split(' - ')[0]
song_time = info.xpath('span[4]/span/text()')[0].strip()
print(rank, song,singer,song_time)
writer.writerow([rank, song,singer,song_time])
except IndexError:
pass
if __name__ == '__main__':
fp = open('C:/Users/luopan/Desktop/kugou.csv', 'w', encoding='utf-8', newline='')
writer = csv.writer(fp)
writer.writerow(['rank', 'song','singer','song_time'])
urls = ['http://www.kugou.com/yy/rank/home/{}-8888.html?from=rank'.format(str(i)) for i in range(1,24)]
for url in urls:
get_info(url)