requests庫+正則表達式爬取貓眼電影

咱們用 requests 庫 + 正則表達式構建一個簡陋的爬蟲,雖然這個爬蟲很簡陋,可是經過這個例子咱們能夠對爬蟲有一個很好的瞭解。html


此次目的是爬取貓眼電影 TOP 100,要想爬取這些信息,咱們首先要到貓眼電影 TOP 100 的頁面上觀察一下(也能夠說踩點)。網址爲:https://maoyan.com/board/4python

捕獲.JPG


這就是咱們要爬取的頁面,如今咱們來寫一段代碼自動訪問這個頁面。正則表達式


  1. def get_one_pages(url) -> 'HTML':json

  2.    headers = {     # 構建表頭,模仿正常瀏覽器,防止被屏蔽瀏覽器

  3.        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'服務器

  4.    }微信

  5.    response = requests.get(url, headers=headers)網絡

  6.    if response.status_code == 200:     # 網頁訪問正常函數

  7.        return response.textflex

  8.    return None


咱們構造了 get_one_pages(url) 函數,在構造這個函數時要注意必定要加上表頭,表頭的做用是讓爬蟲假裝成一個正常的瀏覽器請求。若是不加表頭的話,會被服務器拒絕訪問(不信你就試一下)。以後當你調用這個函數並往裏面傳入 URL 也就是https://maoyan.com/board/4 時,該函數會把這個網頁的 HTML 返回下來。HTML 算是網頁的源代碼,在 Chrome 瀏覽器中按下 F12 鍵就能看到源代碼,發現返回的 HTML 與網頁中的 HTML 同樣,那麼證實咱們這個網頁算是訪問成功了。


下一步咱們要解析這個網頁,獲取咱們想要的內容。觀察返回的 HTML 會發現,每個電影的相關信息被一個 <dd> </dd> 標籤包圍。

2.JPG

以這段標籤爲例,咱們須要獲取的內容有排名、電影海報、電影名稱、演員和上映時間。這時該輪到正則表達式出場了。咱們用正則表達式去匹配這段文本,來獲取想要的信息,若是你如今還不知道什麼是正則表達式,能夠 Google 一下,正則表達式的內容很複雜,但這裏咱們用到的很簡單,一搜就會。


下面是解析網頁的代碼:


  1. def parse_one_page(html) -> list:

  2.    pattern = re.compile('<dd>.*?>(.*?)</i>.*?<img data-src="(.*?)".*?title="(.*?)".*?<p class="star">(.*?)</p>.*?>(.*?)</p> ',

  3.                         re.S)

  4.    res = re.findall(pattern, html)

  5.    for i in res:

  6.        yield {     # 這裏使用了生成器構造一個字典

  7.            'index': i[0],

  8.            'image': i[1],

  9.            'name': i[2].strip(),

  10.            'actor': i[3].strip(),

  11.            'time': i[4].strip(),

  12.        }


咱們用 <dd>.*?>(.*?)</i>.*?<img data-src="(.*?)".*?title="(.*?)".*?<p class="star">(.*?)</p>.*?>(.*?)</p> 這段正則表達式來匹配想要的內容,而後將匹配的結果存入一個字典中,爲了之後方便讀取和保存。


下一步咱們把爬到的內容保存下來,不然一旦關閉程序,全部爬取的內容就會消失,白忙一頓豈不是很難受。


  1. def write_to_file(content):

  2.    with open('result.txt', 'a', encoding='utf-8') as f:

  3.        f.write(json.dumps(content, ensure_ascii=False) + '\n')


咱們用上下文管理器打開一個 txt 文件,將爬下來的內容寫入這個文件中。


咱們的目標是爬取貓眼電影 TOP 100,但是如今才爬到 TOP 10,那後面的怎麼辦呢?再來觀察網頁,咱們看到,第11-20的URL爲:https://maoyan.com/board/4?offset=10

3.JPG

第21-30的URL爲:https://maoyan.com/board/4?offset=20 ,以此類推。。。


那麼咱們能夠推斷出來網頁的變化只跟 offset= 後面數字有關,這樣能夠繼續寫代碼了。


  1. def main(offset):

  2.    url = 'http://maoyan.com/board/4?offset=' + str(offset)

  3.    html = get_one_pages(url)

  4.    content = parse_one_page(html)

  5.    for i in content:

  6.        print(i)

  7.        write_to_file(i)


這裏寫了一個 main(offset) 函數,傳入相應的數字,會對相應的網頁進行咱們以前的操做。


最後一步,傳入數字便可。總結一下最終的代碼:


  1. import requests

  2. import re

  3. import json

  4. def get_one_pages(url) -> 'HTML':

  5.    headers = {     # 構建表頭,模仿正常瀏覽器,防止被屏蔽

  6.        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36'

  7.    }

  8.    response = requests.get(url, headers=headers)

  9.    if response.status_code == 200:     # 網頁訪問正常

  10.        return response.text

  11.    return None

  12. def parse_one_page(html) -> list:

  13.    pattern = re.compile('<dd>.*?>(.*?)</i>.*?<img data-src="(.*?)".*?title="(.*?)".*?<p class="star">(.*?)</p>.*?>(.*?)</p> ',

  14.                         re.S)

  15.    res = re.findall(pattern, html)

  16.    for i in res:

  17.        yield {     # 這裏使用了生成器構造一個字典

  18.            'index': i[0],

  19.            'image': i[1],

  20.            'name': i[2].strip(),

  21.            'actor': i[3].strip(),

  22.            'time': i[4].strip(),

  23.        }

  24. def write_to_file(content):

  25.    with open('result.txt', 'a', encoding='utf-8') as f:

  26.        f.write(json.dumps(content, ensure_ascii=False) + '\n')

  27. def main(offset):

  28.    url = 'http://maoyan.com/board/4?offset=' + str(offset)

  29.    html = get_one_pages(url)

  30.    content = parse_one_page(html)

  31.    for i in content:

  32.        print(i)

  33.        write_to_file(i)

  34. for i in range(10):

  35.    main(i*10)


這樣就能夠將貓眼電影 TOP 100 爬取下來,並做爲一個 txt 文件保存,咱們來看看結果:

4.JPG


很不錯,就是咱們期待的結果。


經過這麼一個簡陋的爬蟲程序,咱們對爬蟲已經有了一個大體的瞭解,若是想要爬取到更多有用的內容,僅僅這樣仍是遠遠不夠的,但願你能在爬蟲路上越爬越遠。


以上內容素材來源於 崔慶才《Python 3網絡爬蟲開發實戰》。



ps.若是想要打開新世界的大門,能夠掃描下方的二維碼,關注微信公衆號「SuperFeng」。

請關注公衆號.PNG

相關文章
相關標籤/搜索