爬虫 | 百行代码爬取14.5W条豆瓣图书信息
前言
先上一波爬取的结果:
实战
引入类库
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页显示如下:
# 请求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条豆瓣图书信息相关推荐
- python爬虫-20行代码爬取王者荣耀所有英雄图片,小白也轻轻松松
1.环境 python3.6 需要用到的库: re.os.requests 2.简介 王者荣耀可以算得上是比较受欢迎的手游之一了,应该有不少的人都入坑过农药,我们今天的目的就是要爬取王者荣耀的高清英雄 ...
- python爬虫爬取图片代码_python爬虫-20行代码爬取王者荣耀所有英雄图片,小白也轻轻松松...
1.环境python3.6 需要用到的库: re.os.requests 2.简介 王者荣耀可以算得上是比较受欢迎的手游之一了,应该有不少的人都入坑过农药,我们今天的目的就是要爬取王者荣耀的高清英雄壁 ...
- 100行代码爬取全国所有必胜客餐厅信息
点击上方"极客猴",选择"置顶公众号" 第一时间获取Python技术干货! 题图: by jinovich from Instagram 阅读文本大概需要 10 ...
- 100 行代码爬取全国所有必胜客餐厅信息
阅读文本大概需要 10 分钟. 当我刚接触 Python 时,我已经被 Python 深深所吸引.Python 吸引我的地方不仅仅能用其编写网络爬虫,而且能用于数据分析.我能将大量的数据中以图形化方式 ...
- Python爬虫利用18行代码爬取虎牙上百张小姐姐图片
Python爬虫利用18行代码爬取虎牙上百张小姐姐图片 下面开始上代码 需要用到的库 import request #页面请求 import time #用于时间延迟 import re #正则表达式 ...
- pyquery获取不到网页完整源代码_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...
爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...
- 教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!!
教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!! 代码展示: 开发环境: windows10 python3.6 开发工具: pycharm weddriver 库: sel ...
- python pyquery不规则数据的抓取_爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网...
爬虫神器之PyQuery实用教程(二),50行代码爬取穷游网 前言 上篇文章 PyQuery (一) 回顾.今天来介绍具体 PyQuery 的使用方法. 穷游网目标与分析 开始之前,按照之前的套路一步 ...
- python爬上市公司信息_实战项目 1:5 行代码爬取国内所有上市公司信息
实战项目 1:5 行代码爬取国内所有上市公司信息 Python入门爬虫与数据分析 在正式开始这门专栏课的学习之前,我们先来看一个简单的爬虫案例.兴趣是最好的老师,当你对爬虫产生兴趣的时候,才会更有动力 ...
最新文章
- Python 简介day01
- golang 返回值报错 cannot use nil as type string in return argument
- iOS自定义的UISwitch按钮
- 可持久化数据结构加扫描线_结构化光扫描
- python爬取小说出现乱码_详解Python解决抓取内容乱码问题(decode和encode解码)
- java循环1000000000_Java11比Java8快多少,不是测试人员一眼也能看懂
- uCharts图表在小程序中的使用
- 在自定义HttpHandler 中使用Session
- Google发布Java 核心工具库——Guava 28.0
- abort has been called翻译_小分享:一款优秀的你还不知道的免费翻译工具推荐给大家...
- 【WPF】命令 --《深入浅出WPF》
- python如何筛选数据_Python如何用filter函数筛选数据
- Mac使用Excel卡顿的提升办法之一
- BeanUtils.copyProperties 和 fastjson 性能对比
- UDP视频流MP2T的分析方法
- 仿权重8高收录面包网pc+手机苹果cmsv8影视网站含迅雷下载N430模板
- 设计一个好的游戏世界观需要哪些必备要素?
- 基于参考辐射源/定标的校正算法
- 终于有人讲透了芯片是什么(设计-制造-封测)
- 龙芯OpenHarmony课程 【2】启动分析
热门文章
- 容联云2020年营收近8亿:亏损5亿,上市45天市值回到起点
- BACnet协议栈中一个Ringbuff编程范例
- 现在互联网是外包公司天下了吗?程序员说不可能,但是…
- 全球与中国医疗BI软件市场深度研究分析报告
- linux收发包内核进程名称,Linux内核IP Queue机制的分析(一)——用户态接收数据包...
- 刘兵《Entity and aspect extraction for opinion mining 》翻译笔记
- 在线检测你的密码是否被泄露
- 【论文读后感】:A simple yet effective baseline for 3d human pose estimation
- java面试题2021
- CSS3—雪碧图和滑动门