学习目标:小白学爬虫的笔记
提示:这里可以添加学习目标
例如:
- 一周掌握 Java 入门知识
学习内容:
数据科学年前大作业:豆瓣Top250电影爬取
目标:
- 电影名称
- 电影引言
- 导演姓名
- 主演
- 电影评分
requests模块:
pip3 install requests
#安装,因为requests库不是内置的
requests提供了一种简单而优雅的方式,用于发送各种HTTP请求。在爬虫中的应用非常广泛。
首先:
要找到需要爬虫爬取的网站:“https://movie.douban.com/top250?start=0&filter=”豆瓣
然后点击右键下的检索(检查),在Internet标签下找到该网页的请求头:
(这里用的是top250?start=0&filter=文件下的"User-Agent": “Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36”)
像User-Agent这样的一般就是可以用的请求头了
然后:
使用requests函数的get方法向服务端发送请求
url = "https://movie.douban.com/top250?start=0&filter="#需要扒的网页的url
headers = {#从网页Internet里翻出的请求头
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
}
response = requests.get(url=url, headers=headers) #发送请求
print(response.status_code)#输出返回的状态码
如果结果是418,那么就是被对方发现了,开了个古早愚人节给你,而如果结果是200,表示成功进了连接(也不一定,有可能别人在逗你玩,但豆瓣上应该是成功了。)
得到了返回值以后:
现在我们可以用BeautifulSoup对象开始对数据的解析了。
格式:project_name = BeautifulSoup(data.text,“parser”)
soup = BeautifulSoup(response.text, "html.parser")#html.parser是python自带的解析器
movies = soup.find_all("div", class_="item")#使用find_all方法定位所有的电影项。
其中顺带将电影定位出来(在豆瓣里电影都在div标签下的item类里)
find_all和find是一个好东西啊!!!
对于不同的网站具体分析了以后,可以用find方法找到我们要的数据了
如下图所示:
在多数的数据前会有标签(div、a、span···)和分类(info、hd···)
根据这些分类可以直接找到需要的内容:
movies = soup.find_all("div", class_="item")
# print(movies)
for movie in movies:
title = movie.find("span", class_="title").text #标题
rating = movie.find("span", class_="rating_num").text #评分
inq = movie.find("span", class_="inq").text #引导
docAndAct = movie.find("p", class_="").text #导演和主演
data.append([title] + [rating] + [docAndAct] + [inq])
""" bd = (
movie.find("div", class_="bd") # 让生成的文件可读性增加
.text.replace(" ", "") # 用replace将空格和换行替换了
.replace("\n\n\n", "")
.replace("\n\n\n", "")
.split("\n")
)
bd = [x for x in bd if x != ""] #将从bd提取的这个大字符串分离
bd = [x for y in bd for x in y.split(" ", 1)] #根据“”和“ ”进行元素的区分
data.append(``````)
"""#注释代码来自CSDN 逸峰轻云
注意:要记得有地方存储代码运行的结果哦!!!
(这里是我提前设定了一个 data[ ]空列表)
最后:
我们把数据打包成文件就可以了!
有很多种方法,这里用 csv的文件转换:
with open(r"TOP250movies.csv", "w", newline="", encoding='utf-8-sig') as file: #组装成文件
writer = csv.writer(file)
writer.writerow(["电影名", "评分","导演和主演"," 电影引言"])
writer.writerows(data)
在这里encoding转码格式可以是utf-8也可以是utf-8-sig,反正我试了试都可以正常显示中文【doge】
补充新知识:R原串
r原串是在写正则表达式的时侯将‘\\\\’的复杂写法改成‘\\’
还可以解决写正则时不符合utf-8规范的问题
写法:
-
原:str = re.findall('a\\\\nbc','a\\bc')
-
现:str = re.findall(r'a\\nbc','a\\bc')
解决print乱码问题:
有的时候在Windows系统里会由于编码格式问题而导致输出乱码:
只要加上:
import sys #解决Windows系统下print的乱码问题
import io
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
就可以了~~~~
最后的最后:
放几张手写笔记(flag)
学习时间:
开始:2024.02.05~结束:2024.02.08