写在前面
个人介绍: 本人91年生,目前30岁了,还是处于学习python的阶段,希望与大家多多交流,如果大家能点个关注或者评论一下的话对我来说是极大的鼓励,有不足之处更请批评指正,希望能与您共同进步!
想说的话: 上次写博文是在11月6日,一转眼过去好几天时间了,这几天中自己也在不断学习python知识,也对之前的博文(hashlib模块、time模块)进行了修订、更新。学习最重要的就是不断吸收新的知识和不断的输出,有的时候感觉学会了,但是想要将学会的东西写出来还是很费时间的,本篇博文从实战入手写一个爬虫,将学过的知识一点点串联起来。
本篇文章参考:《Python网络爬虫从入门到实战》
作者:唐松
开干
功能:爬取豆瓣TOP250的电影数据
网址:https://movie.douban.com/top250
网站分析
目的: 使用构造的字典来伪装一个浏览器请求,防止爬虫被网站禁用
登录网站后,使用开发者工具获取网页信息。将重要的信息写入字典,形式如下
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
'Host': 'movie.douban.com'}
# 仔细看字典中一共就两对键值对,key分别为:User-Agent和Host
登录网站观察:
每一页有25个电影的介绍,要获取完整的250个电影的介绍需要总共10页的内容,点击第二页可以发现网址发生了变化,后面加上了?start=25这个小尾巴。第三页的地址后面加上了?start=50,可见每多一页,就给网页地址的start参数加上25。
项目实践
尝试使用requests模块获取电影网页代码。
import requests
def get_movies():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
'Host': 'movie.douban.com'}
for i in range(0, 10):
link = 'https://movie.douban.com/top250?start=' + str(i * 25)
r = requests.get(link, headers=headers, timeout=10)
print(str(i + 1), '页响应状态码:', r.status_code)
print(r.text)
get_movies()
观察HTML结构
每个电影名都会在这种结构下,以《控方证人》这个电影为例,它存放在一个class='hd’的div中的a中的span中,可能有点绕。。
<div class="hd">
<a href="https://movie.douban.com/subject/1296141/" class="">
<span class="title">控方证人</span>
<span class="title"> / Witness for the Prosecution</span>
<span class="other"> / 雄才伟略 / 情妇</span>
</a>
<span class="playable">[可播放]</span>
</div>
完整代码
import requests
from bs4 import BeautifulSoup
def get_movies():
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
'Host': 'movie.douban.com'}
movie_list = []
for i in range(0, 10):
link = 'https://movie.douban.com/top250?start=' + str(i * 25)
r = requests.get(link, headers=headers, timeout=10)
print(f'{i + 1}页响应状态码:', r.status_code)
soup = BeautifulSoup(r.text, 'lxml')
div_list = soup.find_all('div', class_='hd')
for each in div_list:
movie = each.a.span.text.strip()
movie_list.append(movie)
return movie_list
movies = get_movies()
print(movies)
结果
写在最后
希望大家通过这个小的爬虫学到一些基本的思想和用法,在生活中爬取自己想要的信息。
希望在学习的路上与您多多交流,有什么问题或者有何指教可在下方回复,谢谢。