python3 網路爬蟲開發實戰 貓眼top100

風中旅人發表於2020-02-15

我發現自己沒有整理和總結的習慣,有時是學了之後覺得會了,懶得整理,有時是沒有時間,偶爾有時候想起來會寫一篇。但是後來發現忘的還是挺快的,而且想找以前的東西的時候總是不太方便。不過人生在世,總要給這個世界留下點什麼。把自己在學習中得到的東西,所思所想都記錄下來,所以在此立個flag【狗頭】,養成總結和寫作的習慣=-=。
最近在看崔慶才老師的python3網路爬蟲開發實戰爬取貓眼top100的電影資訊。總的來說,爬取的步驟分為兩步,1)使用requests模組的get方法請求網頁資訊;2)使用正規表示式將資訊匹配出來。步驟不麻煩,但是由於時間原因,http協議改為了https協議,不過也可能當時用的就是https協議,不過http請求會跳轉為https請求,不過這個影響不大。另一個是如果像文中那樣設定headers欄位的話會被貓眼的伺服器識別為爬蟲,得到的是一個美團驗證中心的頁面。

1)請求頁面
文中的headers只設定了一個User-Agent欄位,但是會被識別為爬蟲,所以最好將該請求的所有header欄位都設定,這樣貓眼也就無法識別爬蟲和瀏覽器了。cookie欄位不用設定,因為第一次請求是沒有cookie的。
在這裡插入圖片描述2)正則提取
正則提取最重要的就是正規表示式。

<dd>.*?<a href="(.*?)" title="(.*?)".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?</dd>

這是我一開始寫的正則式,還是很稚嫩,感覺太具體了,多了很多不必要的資訊,我提取的資訊和文中提取的資訊不同,只提取了href 、電影名、主演、上映時間。

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>

這是文中的一個正規表示式,我從中理解的正規表示式的書寫原則是先找要匹配資訊前面最近的錨點,然後再從錨點匹配到所要的資訊。

<dd>.*?href="(.*?)" title="(.*?)".*?star.*?>(.*?)<.*?releasetim.*?>(.*?)<.*?</dd>

這是根據文中的方法書寫的正規表示式

程式碼部分

import requests, re

main_url = 'https://maoyan.com/board/4'
films=[]

def getOnePage(url):
    headers = {'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36",
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Encoding':'gzip, deflate, br',
    'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
    'Cache-Control': 'no-cache',
    'Host':'maoyan.com',
    'Pragma':'no-cache',
    'Connection':'keep-alive',
    'Upgrade-Insecure-Requests':'1'
    }
    respond = requests.get(url, headers=headers)
    pattern ='<dd>.*?href="(.*?)" title="(.*?)".*?star.*?>(.*?)<.*?releasetim.*?>(.*?)<.*?</dd>'
    result = re.findall(pattern, respond.text, re.S)
    print(result)
    films.extend(result)

def main():
    all_url=[]
    all_url.append(main_url)
    for i in range(10,100,10):
        tmp = main_url+'/?offset='+str(i)
        all_url.append(tmp)
    for u in all_url:
        getOnePage(u)
    
    # print(films[20])
    with open('maoyan.txt','w') as f:
        line =''
        for i in range(100):
            # print(films[i])
            line_list= list(films[i])
            line_list[2] = line_list[2].strip()
            line = '         '.join(line_list)+'\n'
            f.write(line)

main()

相關文章