前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >爬取豆瓣书单100本

爬取豆瓣书单100本

作者头像
y191024
发布2022-09-20 19:10:21
发布2022-09-20 19:10:21
38500
代码可运行
举报
运行总次数:0
代码可运行

听首歌开心一下

唉,今天本来是在学习爬取梨视频的,但是网页又发生了变化,和老师讲的操作又不一样...而且还变难了...我找了很多资料也实在是不会,只好学习一下爬取电影试试。话说每天的学习之路都好坎坷啊,各种卡住。但是这个爬取电影我还没学习,现在去学习一下。

好家伙,经过我的一番努力后,我发现豆瓣电影的页面是Ajax请求的页面,Ajax请求就是可以在不刷新界面的情况下加载页面的技术,比如说我们平时在网页浏览东西,一直往下滑他能够一直加载,用的就是Ajax请求。所以我爬取不到页面的信息(对不起是我不会)。。。

所以临时降低难度哈哈哈哈,改成爬取豆瓣书单前100,但是后面还有怎么将他写入CSV格式的问题,我需要一边做一边学,加油嗯!

做了差不多了,就差把数据放进csv里了,在做的过程中真的很崩溃,发现了超级多问题,一开始就请求错了网页,然后换了个网页,后来得到了书单的名称,数据的类型有问题,正则也匹配不上,缩进又出问题,xpath定位也错,反反复复一直运行🙁真的好不容易看来我要多加练习,然鹅现在还要学习csv的操作,唉,好难,一度崩溃想哭。现在是自习,复习一下正则好了

回来以后继续做,感觉我就是个废物。。。

现在是11点了,我终于!!!太难了TAT!!!看看成果吧...我只爬取了书名和评分,列标题我还不会添加,真是费尽了千辛万苦啊。

现在贴出代码并逐步分析。

首先看一下我们要爬取的页面:

是可以翻页的,点击后页面会刷新,所以不是Ajax请求的页面。

这是没翻页时的url:

这是翻了一页后的url:

所以我们可以分析出,我们在翻页时,只有start的参数在发生变化,表示的是从第几本开始的书,第一页从0开始,第二页从第25本书开始(也就是说一面有25本书)...后面也以此类推,因此我们可以用param将参数封装在字典里传入get方法中,他会自动帮我们把这些参数放入url中,拼接成图片中的那种url。

就是这些参数:

下面开始来写代码:

第一步还是导包,都是接下来要用到的。

代码语言:javascript
代码运行次数:0
复制
import requests
from lxml import etree
import csv

接下来就是熟悉的对网页发请求,获取页面的信息

代码语言:javascript
代码运行次数:0
复制
url = "https://www.douban.com/doulist/114258184/"
# UA伪装
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
}
datas = {}  # 先创建一个空的字典,方便后面的使用
for page in range(0, 76, 25):
# 获取的page分别是0,25,50,75 刚好4个页面,100本书
# 这里的参数会被传入到url中
    params = {
        "start": page,
        "sort": "time",
        "playable": "0",
        "sub_type": "",
    }
    page_text = requests.get(url=url, headers=headers, params=params).text

接下来就是重头。

我们进入开发者模式,查看一下每个页面每本书的标签定位,然后用xpath定个位。

可以发现所有的书都在div class="clearfix" 的标签下的div标签里的。

接着是要找出书的书名和评分

这是书的标题所在位置

这是书的评分所在位置:

代码语言:javascript
代码运行次数:0
复制
    # 25本书列表
    books_list = tree.xpath('//div[@class="doulist-item"]')
    # 遍历每本书,这里用的是枚举,会有索引相对应
    for index, book in enumerate(books_list):
        data = {}
        # 获取评分,这里返回的是一个列表所以用了索引按顺序取出,否则会出错!所有书的评分相同
        book_score = book.xpath("//div[@class='rating']/span[2]/text()")[index]
        # 获取书本的名称,由于返回的是列表,所以要用索引取出
        book_names = book.xpath(".//div[@class='title']/a/text()")[0]
        # 取出书名两旁的空格
        book_name = book_names.strip()
        # 将数据写入字典中
        data[book_name] = book_score
        # 再字典和总字典datas合并起来
        datas.update(data)

最后打印一下结果看看:

得到了一个字典的结果,现在要将他写入一个CSV文件中。这一步是我在网上学的直接照着敲的,所以还不明白具体的含义,不过今天的目的总算达成了,以后要多给自己安排一些任务,在写的过程中发现自己很多地方多此一举,顺便修改了一下代码,变得更加简洁了。明天再丰富一下这个文件,多放几列数据好了,果然还是要多动手操作,实践出真知嗯。就到这了,不知不觉12点了,晚安。

代码语言:javascript
代码运行次数:0
复制
with open(r"D:/book.csv", "w", encoding="utf-8-sig", newline='') as fp:
    writer = csv.writer(fp)

    for key in datas:
        writer.writerow([key, datas[key]])
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 睡不着所以学编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档