听首歌开心一下
唉,今天本来是在学习爬取梨视频的,但是网页又发生了变化,和老师讲的操作又不一样...而且还变难了...我找了很多资料也实在是不会,只好学习一下爬取电影试试。话说每天的学习之路都好坎坷啊,各种卡住。但是这个爬取电影我还没学习,现在去学习一下。
好家伙,经过我的一番努力后,我发现豆瓣电影的页面是Ajax请求的页面,Ajax请求就是可以在不刷新界面的情况下加载页面的技术,比如说我们平时在网页浏览东西,一直往下滑他能够一直加载,用的就是Ajax请求。所以我爬取不到页面的信息(对不起是我不会)。。。
所以临时降低难度哈哈哈哈,改成爬取豆瓣书单前100,但是后面还有怎么将他写入CSV格式的问题,我需要一边做一边学,加油嗯!
做了差不多了,就差把数据放进csv里了,在做的过程中真的很崩溃,发现了超级多问题,一开始就请求错了网页,然后换了个网页,后来得到了书单的名称,数据的类型有问题,正则也匹配不上,缩进又出问题,xpath定位也错,反反复复一直运行🙁真的好不容易看来我要多加练习,然鹅现在还要学习csv的操作,唉,好难,一度崩溃想哭。现在是自习,复习一下正则好了
回来以后继续做,感觉我就是个废物。。。
现在是11点了,我终于!!!太难了TAT!!!看看成果吧...我只爬取了书名和评分,列标题我还不会添加,真是费尽了千辛万苦啊。
现在贴出代码并逐步分析。
首先看一下我们要爬取的页面:
是可以翻页的,点击后页面会刷新,所以不是Ajax请求的页面。
这是没翻页时的url:
这是翻了一页后的url:
所以我们可以分析出,我们在翻页时,只有start的参数在发生变化,表示的是从第几本开始的书,第一页从0开始,第二页从第25本书开始(也就是说一面有25本书)...后面也以此类推,因此我们可以用param将参数封装在字典里传入get方法中,他会自动帮我们把这些参数放入url中,拼接成图片中的那种url。
就是这些参数:
下面开始来写代码:
第一步还是导包,都是接下来要用到的。
import requests
from lxml import etree
import csv
接下来就是熟悉的对网页发请求,获取页面的信息
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标签里的。
接着是要找出书的书名和评分
这是书的标题所在位置
这是书的评分所在位置:
# 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点了,晚安。
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]])