使用正则表达式爬取票房信息
还是老样子哈哈,如果对正则不是很了解的同学,在这里推荐一个学习网址:
http://www.runoob.com/python3/python3-reg-expressions.html
进入正文,这是我们要爬的网址: http://www.cbooo.cn/year?year=2008
而这个,就是我们要爬的内容了:
第一步,获取网页信息
import requests,re
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
,
'Cookie':'Hm_lvt_daabace29afa1e8193c0e3000d391562=1550206631,1550381059; Hm_lpvt_daabace29afa1e8193c0e3000d391562=1550381609'
}
url="http://www.cbooo.cn/year?year=2008"
req=requests.get(url,headers=headers,timeout=30)
req.encoding='utf-8'
req.text
运行结果:
根据网页的结构,我们可以通过标签来找到我们想要的内容
第二步,在使用正则之前,我们要找到我们需要的标签
在要查看的地方,右键选择检查,就可以在开发者工具里找到我们需要的标签
通过查找,我们发现 <tr> 就是我们要查找的内容
第三步,通过正则获取我们需要的信息
不知道什么是.?和(.?)是什么的同学,不要慌,我会在最后解释的。
rows=re.findall("<tr.*?>(.*?)</tr>",req.text,re.S) #re.S:匹配换行
rows
运行结果:
第四步,过滤多余信息
for row in rows:
tds=re.findall("<td.*?>(.*?)</td>",row,re.S)
print(tds)
运行结果:
第五步,输出内容
由图可知,tds 是一个列表,它除了第一个元素是不规范的,其他都ok了,所以我们还要对他进行过滤,下面我就把它和输出步骤一起写出来了:
if len(tds) != 0:
tds[0] = ''.join(re.findall('.*?</span>(.*?)</p>.*?',row,re.S))
if tds == []:
del tds
else:
print(tds)
运行结果:
这样,我们爬取结果就出来了!
整合代码
PS:以上的代码知爬取了2008年的票房,在这里我加上了一个循环,爬取了2008年到2019年的票房:
import requests,re
#如果headers找不到,可以不加
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
,
'Cookie':'Hm_lvt_daabace29afa1e8193c0e3000d391562=1550206631,1550381059; Hm_lpvt_daabace29afa1e8193c0e3000d391562=1550381609'
}
def request(i):
#发出请求
url="http://www.cbooo.cn/year?year={}".format(i)
req=requests.get(url,headers=headers,timeout=30)
req.encoding='utf-8'
#用正则找标签,r是取消转义
rows=re.findall(r"<tr.*?>(.*?)</tr>",req.text,re.S) #re.S:匹配换行
#过滤多余信息并且循环输出
for row in rows:
tds=re.findall(r"<td.*?>(.*?)</td>",row,re.S)
#对tds第一个元素进行正则匹配
if len(tds) != 0:
tds[0] = ''.join(re.findall(r'.*?</span>(.*?)</p>.*?',row,re.S))
#删除空列表
if tds == []:
del tds
#输出
else:
print(tds)
print("==========================={}年爬取结束===============================".format(i))
#爬取2008年到2019年的年度票房
for i in range(2008,2020):
request(i)
- .*?的意思(个人理解):模糊匹配
- (.*?)的意思(个人理解):就是我们要找的内容
#例子
import re
tds='''
<td class="td1">this is td1</td>
<td class="td2">this is td2</td>
'''
#<td.*?>是匹配所有的<td>标签
all_td=re.findall('<td.*?>(.*?)</td>',tds)
print(all_td)
#匹配td1的内容
td1=re.findall('<td class="td1">(.*?)</td>',tds)
print(td1)
运行结果:
[‘this is td1’, ‘this is td2’]
[‘this is td1’]
好啦,今天的学习笔记就到这里了,有疑惑或好的建议的小伙伴,可以给我留言哦!祝大家学业进步!