直接上代码:
'''
爬取豆瓣科幻小说
url = 'https://book.douban.com/tag/%E7%A7%91%E5%B9%BB' 第1页
url = 'https://book.douban.com/tag/%E7%A7%91%E5%B9%BB?start=20&type=T' 第2页
url = 'https://book.douban.com/tag/%E7%A7%91%E5%B9%BB?start=40&type=T' 第3页
规律是 0 20 40 60 80 100 ............
1 2 3 4 5 6
(page-1)*20
'''
import requests
import parsel
import csv
import time
# 保存数据 csv
f = open('豆瓣科幻小说.csv',mode='a',encoding='utf-8-sig',newline='')
csv_writer = csv.DictWriter(f,fieldnames=['题名','出版信息','评分','评价人数'])
csv_writer.writeheader()
for page in range(1,2):
print(f'+++++++正在打印第{page}页++++++++++')
time.sleep(2) # 太快了会被封ip
url = 'https://book.douban.com/tag/%E7%A7%91%E5%B9%BB'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}
params = {'start':(page-1)*20,'type':'T'}
response = requests.get(url=url,headers=headers,params=params) # 向服务器发起请求
selector = parsel.Selector(response.text) # 转换数据类型 response.text-->可解析对象
list = selector.xpath('//ul[@class="subject-list"]/li') # 整页书籍信息列表
for li in list:
title = li.xpath('.//div[2]/h2/a/@title').get() # .//表示li下面的子节点 题名
publishingInformation = li.xpath('.//div[2]/div[1]/text()').get().strip() # 出版信息
score = li.xpath('.//div[2]/div/span[2]/text()').get() # 评分
numbers = li.xpath(('.//div[2]/div/span[3]/text()')).get().strip() # 评价人数
print(title,publishingInformation,score,numbers)
# 解析下来的数据 写入字典里
dict = {
'题名':title,
'出版信息':publishingInformation,
'评分':score,
'评价人数':numbers
}
csv_writer.writerow(dict)
f.close()
print('=====全部打印完成=======')