python爬虫实例:爬取电影海报

本次实例的任务是从中国电影网上爬取2019年所有上映电影的海报,并按月分类

2019年电影日历:链接

网页结构

F12查看html文件,看到网页结构非常友好:
1
每一个月份下的所有电影都在一个div class=”film-col layout”下面的dl class=”clear”中的<dd>标签下,但是此时里面包含的是对应该部电影的链接
点进去查看下一层网页的结构
2
我们可以看到海报图片位于img class=”poster”下,这其实比较好爬

代码

根据网页结构的分析,我们采用requests+bs4(BeautifulSoup4)库即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import requests
from bs4 import BeautifulSoup
import time
import os
def getFilmHTMLText(url,code='utf-8'):
try:
#加上头部信息后可避免有时候抓取为空的情况
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
r=requests.get(url,timeout=30,headers=headers)
r.raise_for_status()
r.encoding=code
return r.text
except:
return ""
def getThePicture(url,month,countInMonth):
print(url)
#解析具体每个电影的页面获取其海报
#爬取完图片后睡眠5s
html=getFilmHTMLText(url)
soup=BeautifulSoup(html,'html.parser')
img=soup.find_all('img',{"class":"poster"})
print(img[0].attrs['src'])
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
r=requests.get(img[0].attrs['src'],timeout=30,headers=headers)
r.raise_for_status()
filePath='E:/大学课程/大三下学期/数据可视化/电影海报/'+str(month)+'月/'+str(countInMonth)+'.jpg'
with open(filePath,'wb') as f:
f.write(r.content)
except:
print("出现异常!")

time.sleep(5)

def getTheFilm(lst,filmURL):
html=getFilmHTMLText(filmURL)
soup=BeautifulSoup(html,'html.parser')
dl=soup.find_all('dl',{"class":"clear"})
count=1
for f in dl:
x=f.find_all('a',{"class":"film"})
print("月份" + str(count))
countInMounth=0
for pic in x:
#https://www.1905.com
#get the concrete film's url
url="https://www.1905.com"+pic.attrs['href']
getThePicture(url,count,countInMounth)
countInMounth+=1
count+=1
print("下载海报完成!")
if __name__ == '__main__':
filmURL="https://www.1905.com/mdb/film/calendaryear/2019"
flist=[]
getTheFilm(flist,filmURL)

这里需要注意的是在使用requests库的时候最好加上头部信息,否则可能爬取的内容是空的,还有BeautifulSoup的find_all函数真好用