一、爬虫对象-豆瓣电影TOP250
首先,打开豆瓣电影TOP250的页面:豆瓣电影 Top 250
开发好python爬虫代码后,爬取成功后的csv数据,如下:
代码是怎样实现的爬取呢?下面逐一讲解python核心代码。
二、python爬虫代码讲解
首先,导入需要用到的库:
import requests # 发送请求 | |
from bs4 import BeautifulSoup # 解析网页 | |
import pandas as pd # 存取csv | |
from time import sleep # 等待时间 |
然后,向豆瓣电影网页发送请求:
res = requests.get(url, headers=headers) |
利用BeautifulSoup库解析响应页面:
soup = BeautifulSoup(res.text, 'html.parser') |
用BeautifulSoup的select函数,(css解析的方法)编写代码逻辑,部分核心代码:
for movie in soup.select('.item'): | |
name = movie.select('.hd a')[0].text.replace('\n', '') # 电影名称 | |
movie_name.append(name) | |
url = movie.select('.hd a')[0]['href'] # 电影链接 | |
movie_url.append(url) | |
star = movie.select('.rating_num')[0].text # 电影评分 | |
movie_star.append(star) | |
star_people = movie.select('.star span')[3].text # 评分人数 | |
star_people = star_people.strip().replace('人评价', '') | |
movie_star_people.append(star_people) |
其中,需要说明的是,《大闹天宫》这部电影和其他电影页面排版不同:
它的上映年份有3个(其他电影只有1个上映年份),并且以"/"分隔,正好和国家、电影类型的分割线冲突,
所以,这里特殊处理一下:
if name == '大闹天宫 / 大闹天宫 上下集 / The Monkey King': # 大闹天宫,特殊处理 | |
year0 = movie_infos.split('\n')[1].split('/')[0].strip() | |
year1 = movie_infos.split('\n')[1].split('/')[1].strip() | |
year2 = movie_infos.split('\n')[1].split('/')[2].strip() | |
year = year0 + '/' + year1 + '/' + year2 | |
movie_year.append(year) | |
country = movie_infos.split('\n')[1].split('/')[3].strip() | |
movie_country.append(country) | |
type = movie_infos.split('\n')[1].split('/')[4].strip() | |
movie_type.append(type) |
最后,将爬取到的数据保存到csv文件中:
def save_to_csv(csv_name): | |
""" | |
数据保存到csv | |
:return: None | |
""" | |
df = pd.DataFrame() # 初始化一个DataFrame对象 | |
df['电影名称'] = movie_name | |
df['电影链接'] = movie_url | |
df['电影评分'] = movie_star | |
df['评分人数'] = movie_star_people | |
df['导演'] = movie_director | |
df['主演'] = movie_actor | |
df['上映年份'] = movie_year | |
df['国家'] = movie_country | |
df['类型'] = movie_type | |
df.to_csv(csv_name, encoding='utf_8_sig') # 将数据保存到csv文件 |
其中,把各个list赋值为DataFrame的各个列,就把list数据转换为了DataFrame数据,然后直接to_csv保存。
这样,爬取的数据就持久化保存下来了。
三、获取完整源码
附完整源码(无偿分享):