爬蟲從頭學之Requests+正則表達式爬取貓眼電影top100

爬取思路

當我們想要爬取一個頁面的時候,我們要保證思路清晰,爬蟲的思路分四個步驟,發起請求獲取響應內容解析內容存儲內容。根據這四個內容我們的思路就很清晰。以下爲具體步驟

  1. 使用requests庫爬出單頁內容
  2. 根據返回值使用正則表達式分析
  3. 保存至文件
  4. 對目標網站進行循環以及多線程爬取

項目實戰部分

  1. 使用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
  2. 根據返回值使用正則表達式分析

    上一步,我們通過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)
  3. 保存至文件

    對目標網頁的信息處理完成後,我們就需要將其存儲到一個文件中,存儲爲.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文件,打開文件我們可以看到爬取的排名。

  4. 對目標網站進行循環以及多線程爬取

    最後就是對網站進行循環爬取了,到目前爲止,我們只是爬取一個頁面,只有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完成了,其實很簡單,只要我們多動手做做,多分析具體網址,基本就可以將我們想爬取的網站爬取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章