Python爬虫之解析网页!
常用的类库为lxml,BeautifulSoup,re(正则) 以获取豆瓣电影正在热映的电影名为例,url='https://movie.douban.com/cinema/nowplaying/beijing/' 网页分析 部分网页源码 分析可知我们要的电影名称信息在li标签的data-title属性里 下面开始写代码 爬虫源码展示 import requests from lxml import etree # 导入库 from bs4 import BeautifulSoup import re import time # 定义爬虫类 class Spider(): def __init__(self): self.url = 'https://movie.douban.com/cinema/nowplaying/beijing/' self.headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/70.0.3538.77 Safari/537.36' } r = requests.get(self.url,headers=self.headers) r.encoding = r.apparent_encoding self.html = r.text def lxml_find(self): '''用lxml解析''' start = time.time() # 三种方式速度对比 selector = etree.HTML(self.html) # 转换为lxml解析的对象 titles = selector.xpath('//li[@class="list-item"]/@data-title') # 这里返回的是一个列表 for each in titles: title = each.strip() # 去掉字符左右的空格 print(title) end = time.time() print('lxml耗时',end-start) def BeautifulSoup_find(self): '''用BeautifulSoup解析''' start = time.time() soup = BeautifulSoup(self.html,'lxml') # 转换为BeautifulSoup的解析对象()里第二个参数为解析方式 titles = soup.find_all('li',class_='list-item') for each in titles: title = each['data-title'] print(title) end = time.time() print('BeautifulSoup耗时',end-start) def re_find(self): '''用re解析''' start = time.time() titles = re.findall('data-title="(.+)"',self.html) for each in titles: print(each) end = time.time() print('re耗时',end-start) if __name__ == '__main__': spider = Spider() spider.lxml_find() spider.BeautifulSoup_find() spider.re_find() 输出结果 海王 无名之辈 无敌破坏王2:大闹互联网 狗十三 惊涛飓浪 毒液:致命守护者 憨豆特工3 神奇动物:格林德沃之罪 恐龙王 老爸102岁 生活万岁 进击的男孩 摘金奇缘 亡命救赎 一百年很长吗 云上日出 谁是坏孩子 照相师 缘·梦 网络谜踪 龙猫 印度合伙人 绿毛怪格林奇 最萌警探 春天的马拉松 lxml耗时 0.007623910903930664 海王 无名之辈 无敌破坏王2:大闹互联网 狗十三 惊涛飓浪 毒液:致命守护者 憨豆特工3 神奇动物:格林德沃之罪 恐龙王 老爸102岁 生活万岁 进击的男孩 摘金奇缘 亡命救赎 一百年很长吗 超时空大冒险 天渠 爱不可及 二十岁 你好,之华 冒牌搭档 铁甲战神 克隆人 恐怖快递 中国蓝盔 阿凡提之奇缘历险 名侦探柯南:零的执行人 为迈克尔·杰克逊铸造雕像 再见仍是朋友 心迷宫 淡蓝琥珀 阿拉姜色 两个俏公主 云上日出 谁是坏孩子 照相师 缘·梦 网络谜踪 龙猫 印度合伙人 绿毛怪格林奇 最萌警探 春天的马拉松 BeautifulSoup耗时 0.061043500900268555 海王 无名之辈 无敌破坏王2:大闹互联网 狗十三 惊涛飓浪 毒液:致命守护者 憨豆特工3 神奇动物:格林德沃之罪 恐龙王 老爸102岁 生活万岁 进击的男孩 摘金奇缘 亡命救赎 一百年很长吗 超时空大冒险 天渠 爱不可及 二十岁 你好,之华 冒牌搭档 铁甲战神 克隆人 恐怖快递 中国蓝盔 阿凡提之奇缘历险 名侦探柯南:零的执行人 为迈克尔·杰克逊铸造雕像 再见仍是朋友 心迷宫 淡蓝琥珀 阿拉姜色 两个俏公主 云上日出 谁是坏孩子 照相师 缘·梦 网络谜踪 龙猫 印度合伙人 绿毛怪格林奇 最萌警探 春天的马拉松 re耗时 0.0004856586456298828 代码说明 1. lxml 进群:960410445 即可获取源码哦! lxml是通过xpath来查找 使用前需使用调用ertee.HTML()方法('()'内填HTML代码)生成一个可查找的对象 常用xpath语法如下 //两个斜杠为向下查找孙子标签 /一个斜杠为查找直接儿子标签 []方括号内填标签属性,如查找class属性为name的a标签,格式为a[@class="name"] /text()取出标签的内容,如查找网页中的 中的KAINHUCK,格式为?//a[@class="name"]/text() /@attr取出标签的属性,如查找网页中的 中的class属性值name,格式为?//a[@class="name"]/@class 2. BeautifulSoup 使用前需先将HTML转换为课查找对象,格式为 BeautifulSoup(html,'lxml') html 为HTML代码,后面的参数为转换方法(其他方法有?'html.parser'?,?'html5lib'?,推荐使用?'lxml'?) 查找方法 info =?find('a',id='kain')?查找第一个id属性为kain的a标签,并存进info变量中(其他标签同理) find_all('a',class_='name')查找所有class属性为name的a标签(注:?class?属性需写成?'class_') info.p.text获取第一个id属性为kain的a标签下的p标签的内容(info为上面例子里的info,其他同理) info.p['name']获取第一个id属性为kain的a标签下的p标签的name属性值(info为上面例子里的info,其他同理) 当代码中有很多同级标签时
示例代码如下 from bs4 import BeautifulSoup html = ''' 注意:不是从0开始 3. re(正则表达式) 正则表达式内容较多,大家可以参考 这里 总结 使用lxml查找时可以在目标网页按F12调出开发者窗口然后再在按Ctrl+f查找,在查找栏里输入你的xpath语法可以检查是否能找到对应内容 可以从看例子的输出中看出三种方法的速度 lxml耗时 0.007623910903930664 BeautifulSoup耗时 0.061043500900268555 re耗时 0.0004856586456298828 对以上三种最常用的解析网页的方法做个对比 lxml BeautifulSoup re 语法难易度 简单 简单 复杂 查找速度 较快 慢 快 综上,对于网页内容的解析,这里推荐新手使用lxml方法,而对速度有要求就使用正则表达式(入门有点困难) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- python – 对ElementTree解析器进行子类化以保留注释
- 【Python报错】ComplexWarning: Casting complex values to
- python – TypeError:’dict’对象在使用dict()时不可调用
- Django-09-cookie和session
- django – ImportError:没有名为south的模块
- python – 如何为所有alembic创建一个不同的所有者?
- python – Numpy矩阵运算
- python初体验-条件
- 使用Python的Bottle框架写一个简单的服务接口的示例
- python – Autobahn Asyncio ReconnectingClientFactory