爬取思路
當我們想要爬取一個頁面的時候,我們要保證思路清晰,爬蟲的思路分四個步驟,發起請求,獲取響應內容,解析內容,存儲內容。根據這四個內容我們的思路就很清晰。以下爲具體步驟
- 使用requests庫爬出單頁內容
- 根據返回值使用正則表達式分析
- 保存至文件
- 對目標網站進行循環以及多線程爬取
項目實戰部分
使用requests庫爬出單頁內容
爬取url:http://maoyan.com/board/4?
貓眼對爬蟲有一個反爬蟲策略,如果請求頭沒有模仿爲瀏覽器的請求頭會出現禁止訪問,所以這裏我們設置請求頭。
# 獲取頁面 def get_one_page(url): # 反爬蟲,設置用戶請求頭 header = { 'User-Agent' : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36" } # 得到網頁地址的內容 try: response = requests.get(url,headers = header) if response.status_code == 200: return response.text return None except RequestException: return None
根據返回值使用正則表達式分析
上一步,我們通過requests庫爬取目標網頁的所有內容,可是我們需要的是去除HTML標籤後的部分信息,怎麼辦呢,正則表達式派上用場了。這部分主要是正則表達式的書寫,所以學會爬蟲,一個重要的點就是正則表達式,使用正則匹配完頁面所有的相符合內容後,使用yield生成器對正則匹配到的信息進行處理。
# 解析頁面 def parse_one_page(html): pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>' '.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">' '(.*?)</i>.*?</dd>',re.S) itmes = re.findall(pattern,html); for itme in itmes: yield { 'index': itme[0], 'image': itme[1], 'title': itme[2], 'actor': itme[3].strip()[3:], 'time': itme[4].strip()[5:], 'score': itme[5]+itme[6] } # print(itmes)
保存至文件
對目標網頁的信息處理完成後,我們就需要將其存儲到一個文件中,存儲爲.txt文件,並將編碼格式爲utf-8,存儲完成後關閉文件。
# 存儲數據 def write_to_file(content): # a參數代表往後追加 with open('result.txt','a', encoding= 'utf-8') as f: # 一個content代表一個item,後面要換行 f.write(json.dumps(content, ensure_ascii=False) + '\n') f.close()
我們就可以看到result.txt文件,打開文件我們可以看到爬取的排名。
對目標網站進行循環以及多線程爬取
最後就是對網站進行循環爬取了,到目前爲止,我們只是爬取一個頁面,只有10個數據,我們分析下從第一頁到最後一頁的地址變化
http://maoyan.com/board/4?offset=90,我們可以發現offset參數是翻頁地址的變化原因,這樣我們就可以得到從第一頁到最後一頁的地址。
# offset設置爬取下一頁 def main(offset): url = 'http://maoyan.com/board/4?offset=' + str(offset) html = get_one_page(url) # print(html) for item in parse_one_page(html): write_to_file(item) print(item) # 多線程爬取 if __name__ == '__main__': # for i in range(10): # main(i*10) pool = Pool() pool.map(main,[i*10 for i in range(10)])
好了,使用requests庫+正則表達式爬取貓眼電影top100完成了,其實很簡單,只要我們多動手做做,多分析具體網址,基本就可以將我們想爬取的網站爬取。