用正则表达式爬CBO年度票房

使用正则表达式爬取票房信息

还是老样子哈哈,如果对正则不是很了解的同学,在这里推荐一个学习网址:
  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’]


好啦,今天的学习笔记就到这里了,有疑惑或好的建议的小伙伴,可以给我留言哦!祝大家学业进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值