這是平常學python的第17篇原創文章python
上篇文章說了BeautifulSoup庫以後,今篇文章就是利用上篇的知識來爬取咱們今天的主題網站:貓眼電影top100。這個網站也挺容易的,因此你們能夠先本身爬取下,遇到問題再來看下這篇文章哈。git
這篇文章主要是練習而已,別無用處,大佬請繞道哈!github
一、本文用到的庫及網站
正則表達式
-
requests微信
-
BeautifulSoupapp
-
目標網站:http://maoyan.com/board/4python爬蟲
二、分析目標網站ide
很容易找到咱們想要的信息,上面的5的箭頭都是咱們想要的信息,分別是電影圖片地址、電影名字、主演、上演時間和評分。內容有了,接下來就是獲取下一頁的連接。網站
這裏有兩種方法,第一種就是在首頁獲取全部頁的連接,第二種方法就是獲取每一個頁面的下一頁的連接。在這裏因爲只是給了部分頁面的連接出來,因此咱們獲取的是下一頁的連接,這樣子方便點。ui
好了,分析完畢,接下來代碼擼起。
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:https://github.com/SergioJune/gongzhonghao_code/blob/master/python3_spider/index.py
若是這篇文章對你有用,點個贊,轉個發如何?
◐◑爬取《The Hitchhiker’s Guide to Python!》python進階書並製成pdf
◐◑ python爬蟲經常使用庫之BeautifulSoup詳解
平常學python
代碼不止bug,還有美和樂趣
本文分享自微信公衆號 - 平常學python(daily_learn)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。