抓取猫眼电影

注意:抓取内容之前一定要查看下Robots协议

1、准备工作

  1》第一步,安装python,安装requests、json库。

2、抓取分析

  1》接下来我们打开网页分析下猫眼电影排行榜

  2》猫眼电影排行榜的网址(http://maoyan.com/board/4)

   

    3》拉到最下面,可以看到第一页只有10个,点击下一页

      http://maoyan.com/board/4?offset=10,网址变了,添加了offset=10,那也就是说TOP100,offset=10、20、30...

    

   

3、抓取首页

  开始抓取猫眼电影排行的首页

 1 import requests
 2 
 3 
 4 def get_one_page(url):
 5     headers = {
 6         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'   # 代理浏览器
 7             + 'Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
 8     }
 9     response = requests.get(url, headers = headers)   # 响应头
10     if response.status_code == 200:        # 判断是否成功响应
11         return response.text
12     return None
13 
14 def main():
15     url = 'http://maoyan.com/board/4'        # 定义网址
16     html = get_one_page(url)        # 获取对应的HTML
17     print(html)            # 控制台答应HTML
18 
19 main()

   截取其中一个的界面  

  上面我们获取到了html,接下来我们尝试提取其中我们想要的内容

4、正则提取

  

 1 import requests
 2 import re
 3 
 4 
 5 def get_one_page(url):
 6     headers = {
 7         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'   # 代理浏览器
 8             + 'Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
 9     }
10     response = requests.get(url, headers = headers)   # 响应头
11     if response.status_code == 200:        # 判断是否成功响应
12         return response.text
13     return None
14 
15 def parse_one_page(html):
16     pattern = re.compile(
17             '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.'
18             + '*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', re.S   # 正则表达式匹配
19         )
20     items = re.findall(pattern, html)    # 提取匹配项
21     for item in items:
22         yield{
23             'index':item[0],
24             'image':item[1],
25             'title':item[2].strip(),
26             'actor':item[3].strip()[3:],
27             'time':item[4].strip()[5:],
28             'score':item[5] + item[6]
29         }
30 
31 
32 def main():
33     url = 'http://maoyan.com/board/4'        # 定义网址
34     html = get_one_page(url)        # 获取对应的HTML
35     for item in parse_one_page(html):    # 遍历输出
36         print(item)            
37 
38 main()

  我们看下我们抓取第一页后的结果

5、写入文件

  抓取完成后,接下来写入文件

 1 import requests
 2 import re
 3 import json
 4 
 5 
 6 def get_one_page(url):
 7     headers = {
 8         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'   # 代理浏览器
 9             + 'Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
10     }
11     response = requests.get(url, headers = headers)   # 响应头
12     if response.status_code == 200:        # 判断是否成功响应
13         return response.text
14     return None
15 
16 def parse_one_page(html):
17     pattern = re.compile(
18             '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.'
19             + '*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', re.S
20         )
21     items = re.findall(pattern, html)
22     for item in items:
23         yield{
24             'index':item[0],
25             'image':item[1],
26             'title':item[2].strip(),
27             'actor':item[3].strip()[3:],
28             'time':item[4].strip()[5:],
29             'score':item[5] + item[6]
30         }
31 
32 def write_to_file(content):
33     with open('result.txt', 'a', encoding = 'utf-8') as f:
34         f.write(json.dumps(content, ensure_ascii=False) + '\n')
35 
36 def main():
37     url = 'http://maoyan.com/board/4'        # 定义网址
38     html = get_one_page(url)        # 获取对应的HTML
39     for item in parse_one_page(html):
40         print(item)            # 控制台答应HTML
41         write_to_file(item)
42 
43 main()

  看下我们写入的文件,默认在该文件同意目录下

 

  到现在为止才抓取到第一页,接下来抓取其他页

6、分页爬取

  

 1 import requests
 2 import re
 3 import json
 4 import time
 5 
 6 
 7 
 8 def get_one_page(url):
 9     headers = {
10         'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'   # 代理浏览器
11             + 'Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
12     }
13     response = requests.get(url, headers = headers)   # 响应头
14     if response.status_code == 200:        # 判断是否成功响应
15         return response.text
16     return None
17 
18 def parse_one_page(html):
19     pattern = re.compile(
20             '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.'
21             + '*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', re.S
22         )
23     items = re.findall(pattern, html)
24     for item in items:
25         yield{
26             'index':item[0],
27             'image':item[1],
28             'title':item[2].strip(),
29             'actor':item[3].strip()[3:],
30             'time':item[4].strip()[5:],
31             'score':item[5] + item[6]
32         }
33 
34 def write_to_file(content):
35     with open('result.txt', 'a', encoding = 'utf-8') as f:
36         f.write(json.dumps(content, ensure_ascii=False) + '\n')
37 
38 def main(offset):
39     url = 'http://maoyan.com/board/4?offset=' + str(offset)        # 定义网址
40     html = get_one_page(url)        # 获取对应的HTML
41     for item in parse_one_page(html):
42         print(item)            # 控制台答应HTML
43         write_to_file(item)
44 
45 if __name__ == '__main__':
46     for i in range(10):
47         main(offset=i * 10)
48         time.sleep(1)

  这样就把所有的内容爬取下来了

  

  我们看下我们的result.txt文件

  

7、整合代码

  最后一步,所有的代码整合下

  

 1 import requests
 2 import re
 3 import json
 4 import time
 5 from requests.exceptions import RequestException
 6 
 7 
 8 def get_one_page(url):
 9     try:
10         headers = {
11             'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'   # 代理浏览器
12                 + 'Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0'
13         }
14         response = requests.get(url, headers = headers)   # 响应头
15         if response.status_code == 200:        # 判断是否成功响应
16             return response.text
17         return None
18     except RequestException:
19         return None
20 
21 def parse_one_page(html):
22     pattern = re.compile(
23             '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.'
24             + '*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', re.S
25         )
26     items = re.findall(pattern, html)
27     for item in items:
28         yield{
29             'index':item[0],
30             'image':item[1],
31             'title':item[2].strip(),
32             'actor':item[3].strip()[3:],
33             'time':item[4].strip()[5:],
34             'score':item[5] + item[6]
35         }
36 
37 def write_to_file(content):
38     with open('result.txt', 'a', encoding = 'utf-8') as f:
39         f.write(json.dumps(content, ensure_ascii=False) + '\n')
40 
41 def main(offset):
42     url = 'http://maoyan.com/board/4?offset=' + str(offset)        # 定义网址
43     html = get_one_page(url)        # 获取对应的HTML
44     for item in parse_one_page(html):
45         print(item)            # 控制台答应HTML
46         write_to_file(item)
47 
48 if __name__ == '__main__':
49     for i in range(10):
50         main(offset=i * 10)
51         time.sleep(1)    # 休息1秒,防止抓取数据太快,被封IP

   以上呢,利用正则表达式抓去了猫眼电影Top100

8、总结分析

  如果我们需要抓取某些TOP排行榜的网站,我们可以利用requests库,json库。。。去抓取

  1、首先获取首页

  2、分析首页,利用正则表达式,匹配自己需要的信息

  3、分页抓取我么所需要的内容

  4、遍历写入到文件

  这样就算是大功告成了

猜你喜欢

转载自www.cnblogs.com/ppxmaples/p/9694484.html
今日推荐