注意:抓取內容之前一定要查看下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、遍歷寫入到文件
這樣就算是大功告成了