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

        现在我们利用上节刚刚学到的正则表达式来爬取豆瓣电影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('(\d\.\d)',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()的第一个参数9.6,将其替换为(\d\.\d),\d表示匹配一个数字,\.表示匹配一个点号

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

(\d+人评价)

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

 

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

 

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

1                                                                    (.*?)

肖申克的救赎                                     (.*?)

9.6       (.*?)

1189212人评价                                                      (.*?)

希望让人自由。                                   (.*?)

 

 

 

你可能感兴趣的:(Python爬虫入门,Python爬虫)