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