注意:抓取内容之前一定要查看下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>.*?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>.*?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>.*?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>.*?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、遍历写入到文件
这样就算是大功告成了