python爬虫(案例)——豆瓣读书爬虫
文章目录
- 要爬取的内容
- 一级页面(分类中图书的列表)
- 二级页面(每本书的详情页)
- 本案例中的防封ip小技巧
- 多用几个user-agent(随机抽取)
- 设置间隔时间
- 完整代码
本篇文章为豆瓣读书爬虫的案例,采用了xpath解析式,比较基础,未涉及其他深入的爬虫知识
要爬取的内容
根据豆瓣图书中不同的分类爬取图书的相关信息 ( 每个分类豆瓣最多给50页数据 )
一级页面(分类中图书的列表)
爬取 : 书名(文本和url),作者,出版社,出版日期,评价数,缩略图链接,短简介
二级页面(每本书的详情页)
通过一级页面 书名的url链接进入二级页面
爬取 : 评分,内容简介,作者简介,标签
本案例中的防封ip小技巧
多用几个user-agent(随机抽取)
def header_x():# 随机获取一个headersuser_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER','Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0']headers = {"User-Agent": random.choice(user_agents)}return headers
常见user-agent大全:https://www.cnblogs.com/zrmw/p/9332801.html(转,大佬写的(非本人))
设置间隔时间
设置每条数据的时间间隔
time.sleep(random.randint(5, 8))
设置换页的时间等待时间
time.sleep(random.randint(3, 5))
注意:随机数千万不要从0开始,不要太小,容易被封ip
完整代码
import requests
from lxml import etree
import csv
import re
import time
import randomdef header_x():# 随机获取一个headersuser_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER','Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0']headers = {"User-Agent": random.choice(user_agents)}return headers# 要爬取的 豆瓣读书中的 分类名称
kinds = ['','']for book_kind in kinds:# 为每个分类创建一个csv文件csvFile = open("{}.csv".format(book_kind), mode="w+", encoding="utf-8")for i in range(1, 51):print('{name} 开始爬取第 {index} 页'.format(name=book_kind,index=i))# 拼接urlurl = 'https://book.douban.com/tag/{name}?start={num}&type=T'.format(name=book_kind,num=i*20-20)headers = header_x()resp = requests.get(url, headers=headers)html = etree.HTML(resp.text)lis = html.xpath("//div[@id='subject_list']/ul/li")for li in lis:try:name = li.xpath("./div[@class='info']/h2/a/@title") # 书名img_url = li.xpath("./div[@class='pic']/a/@href") # 缩略图链接author = li.xpath("./div[@class='info']/div[@class='pub']/text()")[0].strip().split('/')[0] # 作者publisher = li.xpath("./div[@class='info']/div[@class='pub']/text()")[0].strip().split('/')[-3] # 出版社publish_time = li.xpath("./div[@class='info']/div[@class='pub']/text()")[0].strip().split('/')[-2] # 出版年# 判断出版社,出版年份是否在指定位置 如果不在 则跳过if(publish_time.find('-')==-1):continuegrade = li.xpath(".//span[@class='pl']/text()")[0].strip() # 评价数# 处理grade 提取数字grade_num = []grade_num = re.findall("\d+\.?\d*", grade)intro_1 = li.xpath("./div[@class='info']/p/text()")[0].strip() # 小简介# 子链接son_url = li.xpath("./div[@class='info']/h2/a/@href")[0] #子链接resp_son = requests.get(son_url, headers=headers)html_son = etree.HTML(resp_son.text)# 评分score = html_son.xpath("//strong[@class='ll rating_num ']/text()")[0].strip()# 简介intro = ''.join(html_son.xpath("//div[@id='link-report']//div[@class='intro']/p/text()"))# 作者简介author_intro = ''.join(html_son.xpath("//div[@class='indent ']//div[@class='']/div/p/text()"))# 标签label = html_son.xpath("//div[@id='db-tags-section']//a/text()")label = ' '.join(label)except IndexError:continue# 把字符串转换成列表author = list(author.split('&&'))publisher = list(publisher.split('&&'))publish_time = list(publish_time.split('&&'))intro_1 = list(intro_1.split('&&'))score = list(score.split('&&'))intro = list(intro.split('&&'))author_intro = list(author_intro.split('&&'))label = list(label.split('&&'))# 把数据放入列表result = []result.extend(name)result.extend(author)result.extend(img_url)result.extend(publisher)result.extend(publish_time)result.extend(grade_num)result.extend(intro_1)result.extend(score)result.extend(intro)result.extend(author_intro)result.extend(label)# 将列表写入 csv文件write = csv.writer(csvFile)write.writerow(result)# 设置每条数据的时间间隔time.sleep(random.randint(5, 8))print("{name} 第 {index} 页爬取完成!!!".format(name=book_kind,index=i))# 设置换页的时间等待时间time.sleep(random.randint(3, 5))
注: 修改kinds列表,就可以直接开始爬取数据了,最长2.5个小时爬取完一个分类(50页)
注: 因为豆瓣中每个详情页的结构可能不同(我也很是费解),所以有些值爬出来的可能为空,导致处理时程序报错,小编为了方便,遇到为空的就 try…except 直接跳过当前详情页了
python爬虫(案例)——豆瓣读书爬虫相关推荐
- Python爬虫(5):豆瓣读书练手爬虫
Python爬虫(5):豆瓣读书练手爬虫 我们在之前的文章中基本上掌握了Python爬虫的原理和方法,不知道大家有没有练习呢.今天我就来找一个简单的网页进行爬取,就当是给之前的兵书做一个实践.不然不就 ...
- python爬取豆瓣读书top250并保存xls(含源码)
python爬取豆瓣读书top250并保存xls(含源码) 又是霍霍豆瓣的一天O(∩_∩)O哈哈~. 目标网站:http://book.douban.com/top250/ 全军出击!!! 首先,按下 ...
- python爬取豆瓣读书的书名与简介
最近写了一个python爬取豆瓣读书的书名与简介的程序,一开始是要爬取当当书名与简介的,由于涉及动态的一些问题,运用了selenium库,也实现了但是爬取速度慢,而且不稳定,出现被目标计算机积极拒绝访 ...
- python爬取豆瓣读书并进行图形化分析
python爬取豆瓣读书并进行图形化分析 豆瓣读书网页数据爬取并保存至csv 对数据进行分析并汇成图形 绘制散点图 图形效果展示 以下代码内容大多是团队小伙伴的杰作,而本人只是为了能让更多的人学习到知 ...
- python爬取豆瓣读书top250
python爬取豆瓣读书top250,并保存在本地. 分别用requests+re.requests+xpath 完成 1.requests + re import requests import r ...
- Python分布式爬虫实战 - 豆瓣读书
本实例从零到一实现豆瓣读书的所有标签的分布式爬虫编写 本实例使用到的工具: IDE:Pycharm 工具:Python,Scrapy,linux,mysql,redis 需要用到的模块:scrapy ...
- 利用python爬虫获取豆瓣读书数据建立书单
0. 写在前面 网络爬虫: A Web crawler, sometimes called a spider, is an Internet bot that systematically brows ...
- python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面
点击蓝字"python教程"关注我们哟! 我们一直说Python比较简单,代码体量没有别的程序那么大,对于初学者,尤其是零编程基础的初学者来说,感触没有那么明显,那么今天就让你见识 ...
- python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面!
我们一直说Python比较简单,代码体量没有别的程序那么大,对于初学者,尤其是零编程基础的初学者来说,感触没有那么明显,那么今天就让你见识一下:爬取豆瓣读书页面,Python用16行代码就搞定了! p ...
最新文章
- c语言输入函数有什么作用,c语言的输入函数有哪些
- 推荐|深度学习领域引用量最多的前20篇论文简介
- 你在中国有去过那些地区?
- 数据中心运营商如何选择合适的蓄电池
- mysql 5.7 引擎_MySQL 5.7 学习:功能性能的提升
- OpenCV 高级API:TextDetectionModel和TextRecognitionModel
- 苹果平板怎么卸载软件_怎么很好的卸载流氓软件!
- python写文件格式转换程序_python实现txt文件格式转换为arff格式
- 安装gunicorn
- VBS操作注册表设置新建读取,删除等操作(更新中)
- 【Codeforces 486C】Palindrome Transformation
- 深度学习笔记--激活函数:sigmoid,maxout
- Windows密码查看器实现原理
- st语言 数组的常用方法_ST语言入门基础
- 在中兴新支点操作系统玩换装游戏
- adjacent_find
- NTFS文件系统详解 之 文件定位
- python实例:井字棋
- Android 10 添加 lunch
- 更改Thunderbird的默认语言