爬取豆瓣新片榜
本帖最后由 233倔强不秃 于 2020-9-9 14:40 编辑前言:
爬虫入门基本上有将近一个月了,从urllib开始,bs4,正则,requests库,这一个月没之前学习那么积极了。主观原因是因为自己浮躁了,客观原因我认为是现在大多数爬虫教学都稍微过时,很多网站早已加设了反爬机制,
导致课上了实例不能得以验证,从而大大降低了学习的兴趣和动力。这一个月来的心得就是:不懂就查,看不懂接着查,不断尝试,多去找视频学习,多动手练,弄清楚一些关键词再去看代码或者文章可能会更好。
一、整体思路:
请求头中设置了User-Agent,用了requests库的session方法模拟登陆获取cookie,然后就是正则表达式的编写(这个正则实在是太简单了。。。),其实不用正则也可以。从HTML文档中提取出榜单、链接和海报的地址,然后
分别保存,保存时注意格式。
二、遇到的问题:
保存格式的问题。因为榜单中有这样一个电影:《1/2的魔法》,这样即使我用了中文空格的补齐,但还是在这里出现了差错。还有就是这些符号:【'\\', '"', '/', '*', '?', '<', '>', '|', ':'】,它们都是Windows不支持的文件名。
也就是说在文件名中出现这些符号就会报错,所以我在以电影名为名称保存海报时就遇到了这样的错误。我的解决方案是用“&”将非法字符替换。
三、源代码:
#爬取豆瓣电影新片榜
import requests
import re
def getHTML(url):
try:
head = {'User-Agent' :
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'}
data = {'username' : 'xxxxxx',
'password' : 'xxxxxx'}
login_url = 'https://accounts.douban.com/passport/login?source=movie'
#登陆
session = requests.session() #创建session对象
session.post(login_url, data=data, headers=head)
r = session.get(url, headers=head, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r
except:
print('网页打开错误!')
def parseHTML(html, mlist, mbills):
try:
movie_info = r'<a class="nbg" href="(.+)" +title="(.+)">'
mlist.extend(re.findall(movie_info, html))
movie_imgs = r'"(.+)" *width="75'
mbills.extend(re.findall(movie_imgs, html))
except:
print('网页解析错误!')
def saveMovieList(mlist):
try:
tplt = "\t\t{0:^8}\t\t{1:{3}^10}\t\t{2:^10}\n\n"
with open('F:\\py爬虫\\demo\\豆瓣新片榜\\新片排行榜.txt', 'w') as f:
f.write(tplt.format('排名', '电影名称', '资源链接', chr(12288)))
num = 1
for each in mlist:
f.write(tplt.format(num, each, each, chr(12288)))
num += 1
print('读取完成!')
except:
print('保存榜单错误!')
def downloadMovieBills(mbills, mlist):
try:
index = 0
illegal = ['\\', '"', '/', '*', '?', '<', '>', '|', ':'] #命名时的非法字符
for each in mbills:
name = mlist
for i in name: #非法字符都替换为“&”
if i in illegal:
name = name.replace(i, '&')
with open('F:\\py爬虫\\demo\\豆瓣新片榜\\电影海报\\'+name+'.jpg', 'wb') as f:
img = getHTML(each).content
f.write(img)
index += 1
print('下载完成!')
except:
print('下载海报错误!')
def main():
url = 'https://movie.douban.com/chart'
movies_list = [] #电影排行榜
movies_bills = [] #电影海报链接
html = getHTML(url).text
parseHTML(html, movies_list, movies_bills)#解析HTML
saveMovieList(movies_list)#保存电影排行榜单
downloadMovieBills(movies_bills, movies_list) #下载电影海报
if __name__ == '__main__':
main()
四、心得:
尽量学会独立的解决问题,学习的过程中不可避免遇到很难理解的东西,这些东西往往需要花时间去啃,从而加深理解变为已用。冰冻三尺非一日之寒。
五、资源下载
鼓励{:10_298:}
页:
[1]