前言

先上一波爬取的结果:


数据库中部分截图

实战

引入类库

import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException
from urllib.parse import urlencode
import pymongo
import numpy as np
import time
from faker import Faker

分析页面请求

分析目标页面

打开开发者模式,查看链接

点击任意标签,分析页面请求

分别请求不同的标签页面,分析请求链接,可以发现如下规律:

tag_url = 'https://book.douban.com' + 标签页中a标签括起来的内容

由此,我们可以构建以下代码,以获取标签页面所有标签链接:

# 解析总标签页面,并拼接获得所有标签页页面链接
def splice_tags_indexhtml(html):url = 'https://book.douban.com'book_tags = []tags_url = []soup = BeautifulSoup(html, 'lxml')tagurl_lists = soup.select('#content > div > div.article > div > div > table > tbody > tr > td > a')for tag_url in tagurl_lists:# 获取全部标签的a标签内容,并拼接到一起book_tags += [tag_url.attrs["href"]]for book_tag in book_tags:tags_url.append([url + book_tag])return tags_url

我们进入单个标签页面,分析图书列表页面,解析我们需要存储的字段
我们通过bs4解析我们需要的字段,如:出版时间,作者/译者,豆瓣评分,售价,评价人数等。

# 解析单个tag页面下单页的信息
def parse_tag_page(html):try:soup = BeautifulSoup(html,"lxml")tag_name = soup.select('title')[0].get_text().strip()list_soup = soup.find('ul', {'class': 'subject-list'})if list_soup == None:print('获取信息列表失败')else:for book_info in list_soup.findAll('div', {'class': 'info'}):# 书名title = book_info.find('a').get('title').strip()# 评价人数people_num = book_info.find('span', {'class': 'pl'}).get_text().strip()# 出版信息,作者pub = book_info.find('div', {'class': 'pub'}).get_text().strip()pub_list = pub.split('/')try:author_info = '作者/译者: ' + '/'.join(pub_list[0:-3])except:author_info = '作者/译者: 暂无'try:pub_info = '出版信息: ' + '/'.join(pub_list[-3:-1])except:pub_info = '出版信息: 暂无'try:price_info = '价格: ' + '/'.join(pub_list[-1:])except:price_info = '价格: 暂无'try:rating_num= book_info.find('span', {'class': 'rating_nums'}).get_text().strip()except:rating_num = '0.0'book_data = {'title': title,'people_num': people_num,'author_info': author_info,'pub_info': pub_info,'price_info': price_info,'rating_num': rating_num}# return book_dataif book_data:save_to_mongo(book_data,tag_name)except:print('解析错误')return None

到这里,我们已经可以获取到单个tag下单页的图书信息,这个时候我们只需要加入翻页功能就可以实现单个tag下所有图书的信息爬取。

点击下一页,分析页面请求

可以看到页面多了start和type两个参数,同时start参数是从0开始并以20的偏移量递增的,我们按照这个规律可以构建一个生成器以生成start参数。
从文章的第一张图,可以看出不同的tag页有不同的数量的图书,那页面数量也不尽相同,这时应该如何构建生成器?
这个时候我们发现所有的tag在第50页之后都请求不出信息了,所以我们只需构建前50页的页面链接即可,第51页显示如下:

第51页的显示结果
# 请求tag下的每个页面
def get_tag_page(tag_url,page):formdata = {'start': page,'type': 'T'}url = tag_url[0]+'?'+ urlencode(formdata)try:reponse = requests.get(url, headers=headers)if reponse.status_code == 200:return reponse.textreturn Noneexcept RequestException:print('请求列表页错误')return None

反反爬
豆瓣的反爬简单粗暴,直接封IP,为了爬虫的健壮,可以使用代理或者随机Header+随机时延的方式,随机时延可以设置为30到40之间,不过这样大大影响了爬取速率,如果需要快速爬取可以采用代理+多线程+随机Header+随机时延这样就能避过反爬又能快速爬取。

#使用Faker库随机生成虚假header
from faker import Faker
fake = Faker()
headers ={'User-Agent':fake.user_agent()}

留心

  • 写给之后的自己
    文章是写完代码后,重新回顾的时候写的,回顾之后发现有很多需要优化的地方,比如异常处理部分经常考虑不周导致在爬取的时候异常中断,不得不重新排查错误。还有爬虫的断点续传的功能应该去了解学习下。

尾言

  • 写给公众号的读者
    公众号的资源已经都整合到一篇文章中了,后台回复「资源」即可获取公众号资源合集,失效部分已补在留言部分。
    我是讲不了段子,编不了故事的咸鱼,这篇文章是咸鱼的第9篇原创文章,感谢大家的支持。

推荐阅读

爬虫 | 爬取拉勾网python岗位信息(超详细)

资源汇总 | 从入门到入职,和咸鱼一起进步

咸鱼普拉思

一只咸鱼在编程路上的摸爬滚打,记录摸索中的点点滴滴。

爬虫 | 百行代码爬取14.5W条豆瓣图书信息相关推荐

  1. python爬虫-20行代码爬取王者荣耀所有英雄图片,小白也轻轻松松

    1.环境 python3.6 需要用到的库: re.os.requests 2.简介 王者荣耀可以算得上是比较受欢迎的手游之一了,应该有不少的人都入坑过农药,我们今天的目的就是要爬取王者荣耀的高清英雄 ...

  2. python爬虫爬取图片代码_python爬虫-20行代码爬取王者荣耀所有英雄图片,小白也轻轻松松...

    1.环境python3.6 需要用到的库: re.os.requests 2.简介 王者荣耀可以算得上是比较受欢迎的手游之一了,应该有不少的人都入坑过农药,我们今天的目的就是要爬取王者荣耀的高清英雄壁 ...

  3. 100行代码爬取全国所有必胜客餐厅信息

    点击上方"极客猴",选择"置顶公众号" 第一时间获取Python技术干货! 题图: by jinovich from Instagram 阅读文本大概需要 10 ...

  4. 100 行代码爬取全国所有必胜客餐厅信息

    阅读文本大概需要 10 分钟. 当我刚接触 Python 时,我已经被 Python 深深所吸引.Python 吸引我的地方不仅仅能用其编写网络爬虫,而且能用于数据分析.我能将大量的数据中以图形化方式 ...

  5. Python爬虫利用18行代码爬取虎牙上百张小姐姐图片

    Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...

  6. pyquery获取不到网页完整源代码_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...

    爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...

  7. 教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!!

    教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!! 代码展示: 开发环境: windows10 python3.6 开发工具: pycharm weddriver 库: sel ...

  8. python pyquery不规则数据的抓取_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...

    爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...

  9. python爬上市公司信息_实战项目 1:5 行代码爬取国内所有上市公司信息

    实战项目 1:5 行代码爬取国内所有上市公司信息 Python入门爬虫与数据分析 在正式开始这门专栏课的学习之前,我们先来看一个简单的爬虫案例.兴趣是最好的老师,当你对爬虫产生兴趣的时候,才会更有动力 ...

最新文章

  1. Python 简介day01
  2. golang 返回值报错 cannot use nil as type string in return argument
  3. iOS自定义的UISwitch按钮
  4. 可持久化数据结构加扫描线_结构化光扫描
  5. python爬取小说出现乱码_详解Python解决抓取内容乱码问题(decode和encode解码)
  6. java循环1000000000_Java11比Java8快多少,不是测试人员一眼也能看懂
  7. uCharts图表在小程序中的使用
  8. 在自定义HttpHandler 中使用Session
  9. Google发布Java 核心工具库——Guava 28.0
  10. abort has been called翻译_小分享:一款优秀的你还不知道的免费翻译工具推荐给大家...
  11. 【WPF】命令 --《深入浅出WPF》
  12. python如何筛选数据_Python如何用filter函数筛选数据
  13. Mac使用Excel卡顿的提升办法之一
  14. BeanUtils.copyProperties 和 fastjson 性能对比
  15. UDP视频流MP2T的分析方法
  16. 仿权重8高收录面包网pc+手机苹果cmsv8影视网站含迅雷下载N430模板
  17. 设计一个好的游戏世界观需要哪些必备要素?
  18. 基于参考辐射源/定标的校正算法
  19. 终于有人讲透了芯片是什么(设计-制造-封测)
  20. 龙芯OpenHarmony课程 【2】启动分析

热门文章

  1. 容联云2020年营收近8亿:亏损5亿,上市45天市值回到起点
  2. BACnet协议栈中一个Ringbuff编程范例
  3. 现在互联网是外包公司天下了吗?程序员说不可能,但是…
  4. 全球与中国医疗BI软件市场深度研究分析报告
  5. linux收发包内核进程名称,Linux内核IP Queue机制的分析(一)——用户态接收数据包...
  6. 刘兵《Entity and aspect extraction for opinion mining 》翻译笔记
  7. 在线检测你的密码是否被泄露
  8. 【论文读后感】:A simple yet effective baseline for 3d human pose estimation
  9. java面试题2021
  10. CSS3—雪碧图和滑动门