requests+正则表达式提取猫眼电影top100

本文介绍了一种使用Python的requests库和正则表达式从猫眼电影网站爬取Top100电影信息的方法。具体步骤包括发送HTTP请求获取网页内容,使用正则表达式解析HTML提取电影排名、海报链接、影片名称、演员名单、上映时间及评分等信息,并将这些信息保存为JSON格式。
 1 #requests+正则表达式提取猫眼电影top100
 2 import requests
 3 import re
 4 import json
 5 from requests.exceptions import RequestException
 6 from multiprocessing import Pool
 7 
 8 def get_one_page(url):
 9     headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 LBBROWSER'}
10     try:
11         response = requests.get(url,headers = headers)
12         if response.status_code == 200:
13             return response.text
14         else:
15             return None
16     except RequestException:
17         return None
18 
19 def parse_one_page(html):
20     pattern = re.compile(r'<dd>.*?board-index.*?">(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)
21     results = re.findall(pattern,html)#这一步生成的其实是由元组组成的列表,列表的每一个元素是元组,元组则有前面正则表达式提取的电影名称,地址,演员名,上映时间,排序,评分等,这个列表怎么用,是一个很重要的问题
22     for result in results:
23         yield{
24             'index':result[0],
25             'add':result[1],
26             'title':result[2],
27             'actor':result[3].strip(),
28             'time':result[4].strip(),
29             'score':result[5]+result[6]
30 
31         }#生成器,返回一个个由键值对组成的字典
32 
33 def save_one_page(content):
34     with open('D://result.txt','a',encoding='utf-8') as f:#当重新打开的时候,由于文件是gbk编码的,默认用gbk去打开,而此时打开的是unicode,所以无法打开,解决的方法是改变目标文件的编码
35         f.write(json.dumps(content,ensure_ascii=False)+'\n')#这里表示用中文写入,即gbk,回到上一步
36         '''如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如xml,但更好的方法是序列化为json,因为,json表现出来就是一个字符串,可以被所有语言读取,
37         也可以方便地存储到磁盘或者通过网络传输,json不仅是标准格式,并且比xml还快,而且可以在web页面中读取,非常方便。
38         将Python对象序列化为json用json.dumps(obj),意为把对象倾倒进入json
39         将json转换成python用json.loads(obj)意为把json对象加载出来'''
40 
41 
42 def main():
43     for i in range(10):
44 
45         url = 'http://maoyan.com/board/4'+'?offset='+str(i*10)
46         html = get_one_page(url)
47         results = parse_one_page(html)
48         for item in results:
49             print(item)
50             save_one_page(item)
51 
52 if __name__=='__main__':
53     main()

 

 1 #多进程版
 2 import requests
 3 import re
 4 import json
 5 from requests.exceptions import RequestException
 6 from multiprocessing import Pool
 7 
 8 def get_one_page(url):
 9     headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 LBBROWSER'}
10     try:
11         response = requests.get(url,headers = headers)
12         if response.status_code == 200:
13             return response.text
14         else:
15             return None
16     except RequestException:
17         return None
18 
19 def parse_one_page(html):
20     pattern = re.compile(r'<dd>.*?board-index.*?">(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)
21     results = re.findall(pattern,html)#这一步生成的其实是由元组组成的列表,列表的每一个元素是元组,元组则有前面正则表达式提取的电影名称,地址,演员名,上映时间,排序,评分等,这个列表怎么用,是一个很重要的问题
22     for result in results:
23         yield{
24             'index':result[0],
25             'add':result[1],
26             'title':result[2],
27             'actor':result[3].strip(),
28             'time':result[4].strip(),
29             'score':result[5]+result[6]
30 
31         }#生成器,返回一个个由键值对组成的字典
32 
33 def save_one_page(content):
34     with open('D://result.txt','a',encoding='utf-8') as f:#当重新打开的时候,由于文件是gbk编码的,默认用gbk去打开,而此时打开的是unicode,所以无法打开,解决的方法是改变目标文件的编码
35         f.write(json.dumps(content,ensure_ascii=False)+'\n')#这里表示用中文写入,即gbk,回到上一步
36         '''如果我们要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如xml,但更好的方法是序列化为json,因为,json表现出来就是一个字符串,可以被所有语言读取,
37         也可以方便地存储到磁盘或者通过网络传输,json不仅是标准格式,并且比xml还快,而且可以在web页面中读取,非常方便。
38         将Python对象序列化为json用json.dumps(obj),意为把对象倾倒进入json
39         将json转换成python用json.loads(obj)意为把json对象加载出来'''
40 
41 
42 def main(pagenum):
43 
44 
45     url = 'http://maoyan.com/board/4?offset='+str(pagenum)
46     html = get_one_page(url)
47     results = parse_one_page(html)
48     for item in results:
49         print(item)
50         save_one_page(item)
51 
52 if __name__=='__main__':
53     pool = Pool()
54     pool.map(main,[x*10 for x in range(10)])

 

转载于:https://www.cnblogs.com/themost/p/6883336.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值