文章目录

  • 要爬取的内容
    • 一级页面(分类中图书的列表)
    • 二级页面(每本书的详情页)
  • 本案例中的防封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爬虫(案例)——豆瓣读书爬虫相关推荐

  1. Python爬虫(5):豆瓣读书练手爬虫

    Python爬虫(5):豆瓣读书练手爬虫 我们在之前的文章中基本上掌握了Python爬虫的原理和方法,不知道大家有没有练习呢.今天我就来找一个简单的网页进行爬取,就当是给之前的兵书做一个实践.不然不就 ...

  2. python爬取豆瓣读书top250并保存xls(含源码)

    python爬取豆瓣读书top250并保存xls(含源码) 又是霍霍豆瓣的一天O(∩_∩)O哈哈~. 目标网站:http://book.douban.com/top250/ 全军出击!!! 首先,按下 ...

  3. python爬取豆瓣读书的书名与简介

    最近写了一个python爬取豆瓣读书的书名与简介的程序,一开始是要爬取当当书名与简介的,由于涉及动态的一些问题,运用了selenium库,也实现了但是爬取速度慢,而且不稳定,出现被目标计算机积极拒绝访 ...

  4. python爬取豆瓣读书并进行图形化分析

    python爬取豆瓣读书并进行图形化分析 豆瓣读书网页数据爬取并保存至csv 对数据进行分析并汇成图形 绘制散点图 图形效果展示 以下代码内容大多是团队小伙伴的杰作,而本人只是为了能让更多的人学习到知 ...

  5. python爬取豆瓣读书top250

    python爬取豆瓣读书top250,并保存在本地. 分别用requests+re.requests+xpath 完成 1.requests + re import requests import r ...

  6. Python分布式爬虫实战 - 豆瓣读书

    本实例从零到一实现豆瓣读书的所有标签的分布式爬虫编写 本实例使用到的工具: IDE:Pycharm 工具:Python,Scrapy,linux,mysql,redis 需要用到的模块:scrapy ...

  7. 利用python爬虫获取豆瓣读书数据建立书单

    0. 写在前面 网络爬虫: A Web crawler, sometimes called a spider, is an Internet bot that systematically brows ...

  8. python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面

    点击蓝字"python教程"关注我们哟! 我们一直说Python比较简单,代码体量没有别的程序那么大,对于初学者,尤其是零编程基础的初学者来说,感触没有那么明显,那么今天就让你见识 ...

  9. python爬取豆瓣读书简单_Python用16行代码就搞定了爬取豆瓣读书页面!

    我们一直说Python比较简单,代码体量没有别的程序那么大,对于初学者,尤其是零编程基础的初学者来说,感触没有那么明显,那么今天就让你见识一下:爬取豆瓣读书页面,Python用16行代码就搞定了! p ...

最新文章

  1. c语言输入函数有什么作用,c语言的输入函数有哪些
  2. 推荐|深度学习领域引用量最多的前20篇论文简介
  3. 你在中国有去过那些地区?
  4. 数据中心运营商如何选择合适的蓄电池
  5. mysql 5.7 引擎_MySQL 5.7 学习:功能性能的提升
  6. OpenCV 高级API:TextDetectionModel和TextRecognitionModel
  7. 苹果平板怎么卸载软件_怎么很好的卸载流氓软件!
  8. python写文件格式转换程序_python实现txt文件格式转换为arff格式
  9. 安装gunicorn
  10. VBS操作注册表设置新建读取,删除等操作(更新中)
  11. 【Codeforces 486C】Palindrome Transformation
  12. 深度学习笔记--激活函数:sigmoid,maxout
  13. Windows密码查看器实现原理
  14. st语言 数组的常用方法_ST语言入门基础
  15. 在中兴新支点操作系统玩换装游戏
  16. adjacent_find
  17. NTFS文件系统详解 之 文件定位
  18. python实例:井字棋
  19. Android 10 添加 lunch
  20. 更改Thunderbird的默认语言

热门文章

  1. 从零开始学习badusb 7月21日
  2. 大数据时代下的贝叶斯公式
  3. 【大数据】中国省级大数据管理局
  4. Linux下常用的工具软件
  5. JDP02-[策略模式]-鸭子模型
  6. 鸭子心包积液发病比较多是因为什么该怎么治疗
  7. Python爬虫之Js逆向案例(2)-某乎搜索
  8. .net中的泛型全面解析
  9. LINUX提权入门手册
  10. cas的service管理