学期:2021-2022学年第一学期
学 院 | 大数据与智能工程学院 | 年 级、 专 业、 班 | 18级数据科学与大数据技术(专升本)一班 | 姓 名 | 学号 | ||
---|---|---|---|---|---|---|---|
实验项目 名称 | 豆瓣读书热门榜单数据获取 |
实验学时: 3h 同组学生姓名: 王美琴、尤博欣、周青青、李昕辰 实验地点: 9317
实验日期: 实验成绩: 批改教师: 批改时间:
指导教师评阅:
- 实验目的:网页解析的方式简单爬取豆瓣读书热门榜单数据
- 实验原理:requests请求、bs4网页解析
- 实验环境 :win10、python3.9、vscode、edge
- 实验步骤:
- http请求获取页面数据
- bs4解析页面
核心代码:
### 网页解析的方式简单爬取豆瓣图书新书速递内容
import requests
from bs4 import BeautifulSoup
import re
import csv
import os
# 保存到csv文件
def saveContent(result):
with open(path + "/out.csv", 'w', newline="", encoding="utf-8") as f:
fieldnames = result[0].keys()
writer = csv.DictWriter(f, fieldnames)
writer.writerows(result)
# 缓存列表中的图片
def saveImg(url, name):
img = requests.get(url, headers=headers).content
with open(path + "/{}.jpg".format(name), "wb") as f:
f.write(img)
if __name__ == "__main__":
# 确立目录
path = "./spider/test/code1_out"
if not os.path.exists(path):
os.makedirs(path)
# 构造请求
url = "https://book.douban.com/"
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36 Edg/93.0.961.47'
}
strhtml = requests.get(url, headers=headers)
print(strhtml.encoding)
# BeautifulSoup解析选择网页
soup = BeautifulSoup(strhtml.text, 'lxml')
data = soup.select(
"#content > div > div.article > div.section.books-express > div.bd > div > div > ul:nth-child(2) > li"
)
result = list()
for item in data:
title = item.select("div.info > div.title > a")[0]
author = item.select("div.info > div.author")[0]
img = item.select("div.cover > a > img")[0]
one = {
"id": re.findall(r'\d+', title.get("href"))[0],
"title": title.get_text(),
"href": title.get("href"),
"img": img.get("src"),
"alt": img.get("alt")
}
result.append(one)
saveImg(img.get("src"), os.path.basename(img.get("src")))
saveContent(result)
- 实验结果及分析:
通过requests库提供方法请求网页url,得到网页数据,并通过BeautifulSoup库对网页数据结构进行解析,分析并提取指定数据。
实验总结:
通过豆瓣读书热门榜单数据获取的实验,实验小组成员们在实践实验当中发现抓取程序并不复杂,但由于数据量较大,我们需要不断重复的访问豆瓣网页,这就不可避免的会被豆瓣的反扒机制发现,这就需要我们创建ip池,不断的改变自己的ip。