您的位置:首页 > 编程语言 > Python开发

Python爬虫入门——2. 4 利用正则表达式爬取豆瓣电影 Top 250

2018-11-11 11:13 549 查看

        现在我们利用上节刚刚学到的正则表达式来爬取豆瓣电影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=
 

话不多说,上代码:

[code]#导入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('<em class="">(\d+)</em>',html.text,re.S)
#将电影名导出到name_list列表
name_list = re.findall('<span class="title">(\w+)</span>',html.text,re.S)
#将评分导入到cord_list列表
cord_list = re.findall('<span class="rating_num" property="v:average">(\d\.\d)</span>',html.text,re.S)
#将多少人参与评价导入到numb_list列表
numb_list = re.findall('<span>(\d+人评价)</span>',html.text,re.S)
#将经典名言导入到word_list列表
word_list = re.findall('<span class="inq">(\w+\D)</span>',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 就可以获得字符串  <em class="">1</em> 我只需要其中的数字,所以我们利用正则表达式来提取;将字符串 替换为<em class="">(\d+)</em>。括号()表示我们提取的是括号里面的数据,\d表示提取的是数字,加号+表示提取数字1次到无限多次。

        findall()的第二个参数是字符串来源,即通过requests获得,并转换为text的网页html。

        findall()的第三个参数是  re  模块的修饰符 re.S(使匹配包括换行在内的所有字符)

        3.2利用re.findall()来查找 影片名称:findall()的第一个参数<span class="title">肖申克的救赎</span>,将其替换为

<span class="title">(\w+)</span>,\w表示获取任意单词字符。加号+表示获取1次到多次

        3.3利用re.findall()来查找 评分:findall()的第一个参数<span class="rating_num" property="v:average">9.6</span>,将其替换为<span class="rating_num" property="v:average">(\d\.\d)</span>,\d表示匹配一个数字,\.表示匹配一个点号

        3.4利用re.findall()来查找 参评人数:findall()的第一个参数<span>1189212人评价</span>,将其替换为

<span>(\d+人评价)</span>

        3.5利用re.findall()来查找经典语录:findall()的第一个参数<span class="inq">希望让人自由。</span>,将其替换为<span class="inq">(\w+\D)</span>,\w匹配任意单词字符。加号表示匹配1次到多次。\D用来匹配逗号

 

4.最后利用for循环将其全部打印

 

5.最重要的是:以上所有的正则表达式都可以使用非贪婪匹配(.*?)来进行匹配!

<em class="">1</em>                                                                    <em class="">(.*?)</em>

<span class="title">肖申克的救赎</span>                                     <span class="title">(.*?)</span>

<span class="rating_num" property="v:average">9.6</span>       <span class="rating_num" property="v:average">(.*?)</span>

<span>1189212人评价</span>                                                      <span>(.*?)</span>

<span class="inq">希望让人自由。</span>                                   <span class="inq">(.*?)</span>

 

[code] 

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: