這是日常學python的第17篇原創文章
上篇文章說了BeautifulSoup庫之後,今篇文章就是利用上篇的知識來爬取我們今天的主題網站:貓眼電影top100。這個網站也挺容易的,所以大家可以先自己爬取下,遇到問題再來看下這篇文章哈。
這篇文章主要是練習而已,別無用處,大佬請繞道哈!
1、本文用到的庫及網站
requests
BeautifulSoup
目標網站:http://maoyan.com/board/4
2、分析目標網站
很容易找到我們想要的資訊,上面的5的箭頭都是我們想要的資訊,分別是電影圖片地址、電影名字、主演、上演時間和評分。內容有了,接下來就是獲取下一頁的連結。
這裡有兩種方法,第一種就是在首頁獲取所有頁的連結,第二種方法就是獲取每個頁面的下一頁的連結。在這裡由於只是給了部分頁面的連結出來,所以我們獲取的是下一頁的連結,這樣子方便點。
好了,分析完畢,接下來程式碼擼起。
3.敲程式碼
什麼都不管,立即來個get請求
import requests
from bs4 import BeautifulSoup
url_start = 'http://maoyan.com/board/4'
response = requests.get(url_start)
if response.status_code == 200:
soup = BeautifulSoup(response.text, 'lxml')
print(response.text)
複製程式碼
輸出結果:
驚不驚喜,意不意外?如果你經常玩爬蟲的,這個就見怪不怪了,我們被反爬了。我們試下加個請求頭試試。
url_start = 'http://maoyan.com/board/4'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'}
response = requests.get(url_start, headers=headers)
複製程式碼
這樣就可以正常返回了,因為一般的網站都會在請求頭上加個反爬的,所以遇到了反爬也不要著急,加個請求頭試試?
接下來用BeautifulSoupL來獲取內容
imgs = soup.select('dd .board-img') # 這是獲取圖片連結
titles = soup.select('dd .board-item-main .name') # 這是獲取電影名字
starses = soup.select('dd .board-item-main .movie-item-info .star') # 這是獲取電影主演
times = soup.select('dd .board-item-main .movie-item-info .releasetime') # 這是獲取電影上映時間
scores = soup.select('dd .board-item-main .score-num') # 這是獲取評分
複製程式碼
這裡每個獲取的語句都包含了每個不同電影的資訊,這樣就不能和正則那樣一次把每個電影的資訊都在同一個字元裡面了。就比如我獲取的圖片,一個語句獲取的是這個頁面的所有電影圖片的連結,我們儲存的時候就要分別取出來了。這裡我用到的是for迴圈0到9把相同的座標的資訊存進同一個字典裡面。
films = [] # 儲存一個頁面的所有電影資訊
for x in range(0, 10):
# 這個是獲取屬性的連結
img = imgs[x]['data-src']
# 下面的都是獲取標籤的內容並去掉兩端空格
title = titles[x].get_text().strip()
stars = starses[x].get_text().strip()[3:] # 使用切片是去掉主演二字
time = times[x].get_text().strip()[5:] # 使用切片是去掉上映時間二字
score = scores[x].get_text().strip()
film = {'title': title, 'img': img, 'stars': stars, 'time': time, 'score': score}
films.append(film)
複製程式碼
接下來就是獲取每一頁的連結
pages = soup.select('.list-pager li a') # 可以看到下一頁的連結在最後一個a標籤
page = pages[len(pages)-1]['href']
複製程式碼
後面的就簡單了,就是利用迴圈把所有頁面的內容都去取出來就可以了,程式碼就不貼出來了。
寫在最後
這個就是BeautifulSoup庫的小練習,用到昨天的內容不多,只是用到了選擇器部分和獲取文字內容和屬性部分,感覺還是正則比較好用點哈,我一個正則就可以獲取每個電影的詳細內容了,如下:
<dd>.*?board-index.*?>([\d]{1,3})</i>.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>.*?class="integer">(.*?)</i>.*?class="fraction">(.*?)</i>
複製程式碼
還需要用到個匹配模式哈:re.S就可以了。所以本人推薦使用正規表示式哈。
需要完整程式碼的請檢視我的github哈!
github:github.com/SergioJune/…
如果這篇文章對你有用,點個贊,轉個發如何?
◐◑爬取《The Hitchhiker’s Guide to Python!》python進階書並製成pdf
◐◑ python爬蟲常用庫之BeautifulSoup詳解
日常學python
程式碼不止bug,還有美和樂趣