现在我们利用上节刚刚学到的正则表达式来爬取豆瓣电影Top250的名单。这是豆瓣电影的连接https://movie.douban.com/top250。豆瓣电影每个页面只有25个数据,所以我们需要爬取10个页面的数据。
首先我们观察一下豆瓣电影第一页的URL,并没有发现什么规律,接着我们手动翻到第二页https://movie.douban.com/top250?start=25&filter=以及第三页https://movie.douban.com/top250?start=50&filter=。这时我们便可以看出规律所在了。当我们把第一页的URL改成相同格式https://movie.douban.com/top250?start=0&filter=发现依然可以访问豆瓣电影第一页。这样我们就可以照搬Python爬虫入门——2. 2爬取酷狗音乐top1-500歌曲信息 博文里面构造URL列表的方法构造所有的URL:
https://movie.douban.com/top250?start=0&filter=
https://movie.douban.com/top250?start=25&filter=
https://movie.douban.com/top250?start=50&filter=
https://movie.douban.com/top250?start=75&filter=
https://movie.douban.com/top250?start=100&filter=
https://movie.douban.com/top250?start=125&filter=
https://movie.douban.com/top250?start=150&filter=
https://movie.douban.com/top250?start=175&filter=
https://movie.douban.com/top250?start=200&filter=
https://movie.douban.com/top250?start=225&filter=
话不多说,上代码:
#导入requests库
import requests
#导入 re 库
import re
#定义请求头,请求头可以使爬虫伪装成浏览器
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
#定义连接网络的列表
url_list = ['https://movie.douban.com/top250?start={0}&filter='.format(str(i)) for i in range(0,250,25)]
#函数主体
for url in url_list:
# 利用requests模块连接网络,它可以打开并读取从网络获取的对象
html = requests.get(url, headers=headers)
#将排名导出到rank_list列表
rank_list = re.findall('(\d+)',html.text,re.S)
#将电影名导出到name_list列表
name_list = re.findall('(\w+)',html.text,re.S)
#将评分导入到cord_list列表
cord_list = re.findall(' ',html.text,re.S)
#将多少人参与评价导入到numb_list列表
numb_list = re.findall('(\d+人评价)',html.text,re.S)
#将经典名言导入到word_list列表
word_list = re.findall('(\w+\D)',html.text,re.S)
#构造一个字典,将所有的内容都存放到字典里面
for rank, name, cord, numb, word in zip(rank_list, name_list, cord_list, numb_list, word_list):
print(rank, name, '评分',cord, numb, word)
1.首先导入reques库、re库、编写请求头headers
2.定义 URL 的连接列表
由于 URL https://movie.douban.com/top250?start={0}&filter= 是每隔25进入下一个页面,所以 列表生成式
.forma( str ( i )) for i in range (0, 250 , 25) 的区间是[0,250),左闭右开,增幅为25。即0,25,50,75.。。。。
3.创建一个for循环,遍历每一个页面
利用requests获取网页
3.1利用re.findall()来查找 排名:findall()的第一个参数是正则表达式,在排名的地方鼠标右键->检查,然后在标亮的源码处 鼠标右键—>Copy—>Copy element 就可以获得字符串 1 我只需要其中的数字,所以我们利用正则表达式来提取;将字符串 替换为(\d+)。括号()表示我们提取的是括号里面的数据,\d表示提取的是数字,加号+表示提取数字1次到无限多次。
findall()的第二个参数是字符串来源,即通过requests获得,并转换为text的网页html。
findall()的第三个参数是 re 模块的修饰符 re.S(使匹配包括换行在内的所有字符)
3.2利用re.findall()来查找 影片名称:findall()的第一个参数肖申克的救赎,将其替换为
(\w+),\w表示获取任意单词字符。加号+表示获取1次到多次
3.3利用re.findall()来查找 评分:findall()的第一个参数
,将其替换为 ,\d表示匹配一个数字,\.表示匹配一个点号3.4利用re.findall()来查找 参评人数:findall()的第一个参数1189212人评价,将其替换为
(\d+人评价)
3.5利用re.findall()来查找经典语录:findall()的第一个参数希望让人自由。,将其替换为(\w+\D),\w匹配任意单词字符。加号表示匹配1次到多次。\D用来匹配逗号
4.最后利用for循环将其全部打印
5.最重要的是:以上所有的正则表达式都可以使用非贪婪匹配(.*?)来进行匹配!
1 (.*?)
肖申克的救赎 (.*?)
1189212人评价 (.*?)
希望让人自由。 (.*?)