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)])