代码仅为完成任务编写,未考虑实际爬取过程的效率问题,仅供参考。在阅读过程中,如果有什么疑问或者建议,欢迎留言互相讨论
编写过程中遇到的问题
正则取不到值的问题:主要表现在取评价人数上,不知道什么原因,所以我用了split替换了正则进行取值。
写入csv的乱码问题:使用ut8写入时在我的电脑上显示乱码,查询后使用uft8-sig解决了。附上参考的博主文章连接
代码如下
import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
# 设置请求头及页数
url = "https://book.douban.com/top250"
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
page_number = [0, 25, 50, 75, 100, 125, 150, 175, 200]
# 用来装书名,作者,评分,评分人数,价格
data_name = []
data_author = []
data_score = []
data_number = []
data_price = []
# 遍历页数获得数据,利用正则取中间变量
for page in page_number:
parammeter = {"start": page}
res = requests.get(url, params=parammeter, headers=head).content
soup = BeautifulSoup(res, "html.parser")
t = soup.findAll(attrs={"class": "item"})
for book_msg in t:
name = book_msg.findAll(attrs={"class": "pl2"})
# 获取书名
qzz = ("".join((re.findall(r'title=\"(.*?)\"\>', str(name)))))
data_name.append(qzz)
author_price_number = book_msg.findAll(attrs={"class": "pl"})
# 获取作者
qzz = ("".join((re.findall(r'pl\"\>(.*?)\/', str(author_price_number)))))
data_author.append(qzz)
# 获得评价人数
jq = str(author_price_number).split(" ")
# qzz = ("".join((re.findall(r'<span class="pl">(.*?)</span>', str(author_price_number)))))
data_number.append(jq[-17].replace("人评价\n", ""))
# 获得价格
qzz = ("".join((re.findall(r'\/(.*?)\</p>', str(author_price_number)))))
jq = qzz.split("/")
data_price.append(jq[-1])
score = book_msg.findAll(attrs={"class": "rating_nums"})
# 获取评分
qzz = ("".join((re.findall(r'rating_nums\"\>(.*?)\<', str(score)))))
data_score.append(qzz)
# 设计文件排版
dataframe = pd.DataFrame({'书名': data_name, '作者': data_author, '豆瓣评分': data_score, '评价人数': data_number, '价格': data_price})
# 将DataFrame存储为csv,index表示是否显示行号,default=True
dataframe.to_csv("D:\豆瓣读书top250.csv", index=False, encoding="utf-8")
print("已完成爬取")
结果图展示
(爬完比较乱,用excle排版下就好了)