记录一次豆瓣读书的爬取

  代码仅为完成任务编写,未考虑实际爬取过程的效率问题,仅供参考。在阅读过程中,如果有什么疑问或者建议,欢迎留言互相讨论
编写过程中遇到的问题
  正则取不到值的问题:主要表现在取评价人数上,不知道什么原因,所以我用了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排版下就好了)
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值