目录
2.所需库(如果安装失败,可以选择去Settings里去手动安装)
前言
新手小白如何成功实现第一次爬虫,从0到1。豆瓣作为必爬之路
一、爬虫是什么?
爬虫(Web Crawler),也称为网络爬虫、网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种自动化程序,用于在互联网上自动抓取、分析和收集数据。它们按照预定的规则或算法,遍历网页上的链接,从一个页面跳转到另一个页面,收集并存储所需的信息。
二、爬虫的主要功能
-
数据收集:爬虫可以收集网页上的文本、图片、视频、链接等各种类型的数据。
-
搜索引擎索引:搜索引擎使用爬虫来发现和索引互联网上的新网页,以便用户能够通过搜索查询找到这些网页。
-
数据挖掘:企业和研究机构利用爬虫从大量网页中提取有价值的信息,用于市场分析、竞争情报、价格监测等。
-
内容聚合:一些网站和应用程序使用爬虫来聚合来自不同来源的内容,如新闻聚合网站、社交媒体聚合应用等。
-
网站监控:网站管理员可以使用爬虫来监控网站的状态、性能以及内容的变化。
-
发送请求:爬虫向目标网站发送HTTP请求,请求访问网页。
-
接收响应:目标网站接收到请求后,返回网页的HTML代码或其他格式的数据。
-
解析网页:爬虫使用解析器(如BeautifulSoup、lxml等)来解析网页内容,提取所需的数据。
-
存储数据:提取的数据被存储到数据库、文件或其他存储介质中。
-
遍历链接:爬虫从当前网页中提取出其他链接,并重复上述过程,直到满足停止条件(如达到预设的抓取深度、时间限制或抓取到足够的数据)。
三、实践
1.简介
目标网站: https://movie.douban.com/top250
需求: 爬取电影中文名、英文名、电影详情页链接、导演、主演、上映年份、国籍、类型、评分、评分人数, 并保存到csv文件当中
目标url: https://movie.douban.com/top250
2.所需库(如果安装失败,可以选择去Settings里去手动安装)
(1)request
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
(2) lxml
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml
打开终端输入上两行代码即可安装成功
3.阶段实现代码
import csv
import requests
from lxml import etree
#目标url
url = "https://movie.douban.com/top250"
# 添加请求头信息
head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0" }
#发送请求 获取响应
response = requests.get(url,headers=head)
print(response.text)
# 网页源码
html = response.text
# 实例化etree对象
tree = etree.HTML(html)
# 利用xpath找到<div class="info">这个标签
divs = tree.xpath('//div[@class="info"]')
# print(divs)
for div in divs:
# title = div.xpath('./div[@class="hd"]/a/span/text()') #这句话需要理解
# print(title)
title_cn= div.xpath('./div[@class="hd"]/a/span/text()')[0]
title_en = div.xpath('./div[@class="hd"]/a/span/text()')[1].strip('\xa0/\xa0')
print(title_cn,title_en)
break
# 获取电影链接
for div in divs:
links = div.xpath('./div[@class="hd"]/a/@href')[0]
print(links)
break
# 获取导演,主演等信息
for div in divs:
#导演
director = div.xpath('./div[@class="bd"]/p/text()')[0].strip().split('导演: ')[1].split('主演: ')[0]
print(director)
#主演
try:
act = div.xpath('./div[@class="bd"]/p/text()')[0].strip().split('导演: ')[1].split('主演: ')[1]
print(act)
except IndexError as e:
print("无主演信息")
print(act)
# 上映年份
Release_year = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[0]
print(Release_year)
# 国籍
nationality = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[1].strip()
print(nationality)
# 类型
genre = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[2].strip()
print(genre)
break
for div in divs:
# 评分
score = div.xpath('./div[@class="bd"]/div/span[2]/text()')[0]
print(score)
# 评分人数
num_score = div.xpath('./div[@class="bd"]/div/span[4]/text()')[0]
print(num_score)
# moive_list.append(dic)
break
for page in range(1, 11):
# 目标url
url = f'https://movie.douban.com/top250?start={(page - 1) * 25}&filter='
# 发送请求, 获取响应
res = requests.get(url, headers=head)
# 打印响应信息
print(res.text)
4.完整代码
#导入模块
import requests
from lxml import etree
import csv
# 请求头信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
moive_list = []
for page in range(1, 11):
# 目标url
url = f'https://movie.douban.com/top250?start={(page - 1) * 25}&filter='
# 发送请求, 获取响应
res = requests.get(url, headers=headers)
# 打印响应信息
# print(res.text)
# 网页源码
html = res.text
# 实例化etree对象
tree = etree.HTML(html)
divs = tree.xpath('//div[@class="info"]')
# print(divs)
for div in divs:
dic = {}
title = div.xpath('./div[@class="hd"]/a/span[@class="title"]/text()')
# 电影中文标题
title_cn = ''.join(title).split('\xa0/\xa0')[0]
dic['电影中文名'] = title_cn
# 电影英文标题
title_en = div.xpath('./div[@class="hd"]/a/span[2]/text()')[0].strip('\xa0/\xa0')
dic['电影英文名'] = title_en
# 电影详情页链接
links = div.xpath('./div[@class="hd"]/a/@href')[0]
dic['电影详情页链接'] = links
# print(links)
# 导演
director = div.xpath('./div[@class="bd"]/p/text()')[0].strip().split('导演: ')[1].split('主演: ')[0]
dic['导演'] = director
# print(director)
# 主演
try:
act = div.xpath('./div[@class="bd"]/p/text()')[0].strip().split('导演: ')[1].split('主演: ')[1]
# print(act)
except IndexError as e:
print(end='')
dic['主演'] = act
# 上映年份
Release_year = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[0]
# print(Release_year)
dic['上映年份'] = Release_year
# print(Release_year)
# 国籍
nationality = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[1].strip()
if len(nationality[0].encode('utf-8')) == 1:
nationality = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[2].strip()
else:
nationality = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[1].strip()
# print(nationality)
dic['国籍'] = nationality
# print(title_cn, nationality)
# 类型
genre = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[2].strip()
if len(div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[1].strip()[0].encode('utf-8')) == 1:
genre = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[3].strip()
else:
genre = div.xpath('./div[@class="bd"]/p/text()')[1].strip().split('/')[2].strip()
dic['类型'] = genre
# print(genre)
# 评分
score = div.xpath('./div[@class="bd"]/div/span[2]/text()')[0]
dic['评分'] = score
# print(score)
# 评分人数
num_score = div.xpath('./div[@class="bd"]/div/span[4]/text()')[0]
dic['评分人数'] = num_score
# print(dic)
moive_list.append(dic)
# print(len(moive_list)) # 检查数据是否全部爬取成功
print(f'*****************第{page}页爬取完成*****************')
print('*****************爬虫结束*****************')
# 数据保存
with open('豆瓣电影Top250.csv', 'w', encoding='utf-8-sig', newline='') as f:
# 1. 创建对象
writer = csv.DictWriter(f, fieldnames=('电影中文名', '电影英文名', '电影详情页链接', '导演', '主演', '上映年份', '国籍', '类型', '评分', '评分人数'))
# 2. 写入表头
writer.writeheader()
# 3. 写入数据
writer.writerows(moive_list)
5.将csv文件转化为xlsx
import pandas as pd
def csv_to_xlsx_pd():
csv = pd.read_csv('豆瓣电影Top250.csv', encoding='utf-8')
csv.to_excel('豆瓣电影Top250.xlsx', sheet_name='data')
if __name__ == '__main__':
csv_to_xlsx_pd()
6.数据展示