python3爬取豆瓣Top250电影信息

以下是通过正则表达式爬取的猫眼电影以及豆瓣电影的相关的电影信息的代码过程。


爬取猫眼电影

分析

打开Chrome的调试工具,可发现相关的信息都在,并且以翻页的形式来得到更多的电影信息。

我们可通过其爬取需要的信息,利用正则表达式来进行文本的挖掘。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
'''
函数目标:
爬取猫眼电影的top100信息
编写时间:
2018-03-28
'''
'''
import requests
import re
import json
if __name__ == '__main__':
print('猫眼电影Top100信息如下:')
#循环10次,得出页面上的Top100的电影信息
for i in range(0, 10):
url = "http://maoyan.com/board/4?"
header = {
'Host':'maoyan.com',
'Referer':'http://maoyan.com/board/4?offset=20',
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
paramters = {
'offset': i * 10}
request_tasget = requests.get(url=url, headers=header, params=paramters)
request_tasget.encoding = 'utf-8'
# 实际上应该考虑考虑网的问题...连不上就一般没有数据返回了,找一个字符作为接口之后利用万能表达式即可
infos_list = re.findall(
r'<dd>.*?board-index.*?>(.*?)</i>.*?alt.*?src="(.*?)".*?<a.*?>(.*?)</a>.*?"star">(.*?)</p>.*?"releasetime">(.*?)</p>.*?"integer">(.*?)</i>.*?"fraction">(.*?)</i>',
request_tasget.text, re.S) # @UndefinedVariable
#建立存储信息的字典
for each in infos_list:
yields = {
'index':each[0],
'image_info':each[1],
'name':each[2],
'actor':each[3].strip(),
'time':each[4],
'score':each[5] + each[6]
}
print(yields)

爬取豆瓣电影

分析

与爬取猫眼电影信息一样,都是一样的,具体的差距还是在豆瓣上爬取信息需要cookie,具体可参考下面的代码。

代码

'''
    函数目标:
    爬取豆瓣Top250的电影信息

    编写时间:
    2018-04-01
'''

import requests
import re 

if __name__ == '__main__':

print('以下为豆瓣Top250的电影信息:')

# 从页面可看到一共有十页,每页上有25个电影的信息
for i in range(0, 10):

    url = "https://movie.douban.com/top250?"
    header = {
            'Connection': 'keep-alive',
            'Cookie': 'bid=x9ipkoKiQgw; _pk_ses.100001.4cf6=*; __utma=30149280.2001666009.1522587991.1522587991.1522587991.1; __utmb=30149280.0.10.1522587991; __utmc=30149280; __utmz=30149280.1522587991.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utma=223695111.1530785565.1522587991.1522587991.1522587991.1; __utmb=223695111.0.10.1522587991; __utmc=223695111; __utmz=223695111.1522587991.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); ll="118146"; _vwo_uuid_v2=D575771A914BC38B3B7D081C0A0296FDC|939d8f7fdff1f383a97d572dab39fa1a; _pk_id.100001.4cf6=1de732c7ac4dc22b.1522587990.1.1522588516.1522587990.; ct=y',
            'Host': 'movie.douban.com',
            'Referer': 'https://movie.douban.com/top250?start=25&filter=',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36}'
             }
    paramters = {
             'start': i * 25,
             'filter':'' 
             }

    tasget = requests.get(url=url, headers=header, params=paramters)
    tasget.encoding = 'utf-8'

    # 匹配正则表达式
    infos = re.findall(r'<li>.*?<em class="">(.*?)</em>.*?alt=.*?src="(.*?)".*?"title">(.*?)</span>.*?class="title">&nbsp;/&nbsp;(.*?)</span>.*?"other">&nbsp;/&nbsp;(.*?)</span>.*?<p class="">(.*?)&nbsp;&nbsp;&nbsp;(.*?)<br>(.*?)&nbsp;/&nbsp(.*?)&nbsp;/&nbsp(.*?)</p>.*?average">(.*?)</span>', tasget.text, re.S)  # @UndefinedVariable

    # 建立一个空字典用于存储相关的信息
    for each in infos:
        yields = {
            'index':each[0],  # 排名
            'img_info':each[1],  # 照片地址
            'name':each[2].strip() + "/" + each[3].strip() + "/" + each[4].strip(),  # 影片名称
            'director':each[5].strip(),  # 导演
            'actor':each[6],  # 演员
            'time_cy':each[7].strip() + each[8],  # 上演时间及地区
            'type':each[9].strip(),  # 影片类型
            'score':each[10]  # 评分
            }

        print(yields)

最后

简单说说其中的含义,表达式.*?是一个万能的匹配式,(.*?)是匹配想要爬取的内容,并且每一次伴随着一个索引号,每一个索引号对应着的信息不同。利用正则表达式可方便的进行文本与代码的分开挖掘,一般在写正则表达式时用html代码中的一些词来进行过渡就可以方便的写出来了。

多说无益,还是需要自己来进行代码的测试了解的。

可根据此博客来学习更多的爬虫知识。

---------------本文终---------------

文章作者:刘俊

最后更新:2019年01月02日 - 14:01

许可协议: 转载请保留原文链接及作者。