Python 50行爬虫抓取并处理图灵书目过程详解


Posted in Python onSeptember 20, 2019

前言

使用 requests进行爬取、BeautifulSoup进行数据提取。

主要分成两步: 第一步是解析图书列表页,并解析出里面的图书详情页链接。 第二步是解析图书详情页,提取出感兴趣的内容,本例中根据不同的数据情况,采用了不同的提取方法,总的感觉就是BeautifulSoup用起来很方便

以下是几个典型HTML内容提取的Python代码片段

1、提取详情页链接

列表页中的详情页链接片段

<h4 class="name">
 <a href="/book/1921" rel="external nofollow" title="深度学习入门:基于Python的理论与实现">
  深度学习入门:基于Python的理论与实现
 </a>
</h4>

提取详情页链接的Python代码

# bs是BeautifulSoup的instance
bs.select('.name')
for 详情链接信息 in bs.select('.name'):
 # 提取出链接
 print(详情链接信息.a.get('href'))

2、提取详情页中的图书名称

详情页中图书名称HTML代码

<h2>
   深度学习入门:基于Python的理论与实现
</h2>

提取图书名称的Python代码

# 因为提取出来的文字前后还带了很多空格,所以要用strip去掉 
bs.h2.get_text().strip()

3、提取电子书价格信息

详情页中电子书价格HTML代码

<dt>电子书</dt>
 <dd>
   <span class="price">¥29.99</span>
 </dd>

提取电子书价格的Python代码

# 因为不是每本书都有电子书,所以要判断一下
有电子书 = bs.find("dt", text="电子书")
if 有电子书:
 价格=有电子书.next_sibling.next_sibling.find("span", {"class": "price"}).get_text().strip()[1:]
 print(float(价格))

完整代码

# ituring.py,python3版本,默认只抓两页,可以通过启动参数控制要抓的列表页范围
import sys
import requests
import time
from bs4 import BeautifulSoup

def 输出图书列表中的详情链接(bs):
 # 找到页面中所有的 <h4 class="name"><a href="/book/..." rel="external nofollow" >...</a></h4>
 for 详情链接信息 in bs.select('.name'):
  # 提取出链接
  yield 详情链接信息.a.get('href')

def 获取图书详情(链接):
 详情页 = requests.get('http://www.ituring.com.cn%s' %链接)
 if 详情页.ok:
  bs = BeautifulSoup(详情页.content, features="html.parser")

  图书 = {}

  图书['title'] = bs.h2.get_text().strip()
  图书['status'] = bs.find("strong", text="出版状态").next_sibling

  有定价 = bs.find("strong", text="定价")
  if 有定价:
   图书['price'] = 有定价.next_sibling

   有电子书 = bs.find("dt", text="电子书")
   if 有电子书:
    图书['ePrice'] = float(有电子书.next_sibling.next_sibling.find("span", {"class": "price"}).get_text().strip()[1:])

  有出版日期 = bs.find("strong", text="出版日期")
  if 有出版日期:
   图书['date'] = 有出版日期.next_sibling

  图书['tags'] = []
  for tag in bs.select('.post-tag'):
   图书['tags'].append(tag.string)

  return 图书

 else:
  print('❌ 详情页 http://www.ituring.com.cn%s' %链接)

def 解析图书列表页(起始页, 终止页):
 for 页序号 in range(起始页 - 1, 终止页): 
  # 逐一访问图书列表页面
  列表页 = requests.get('http://www.ituring.com.cn/book?tab=book&sort=new&page=%s' %页序号)

  if 列表页.ok:
   # 创建 BeautifulSoup 的 instance
   bs = BeautifulSoup(列表页.content, features="html.parser")

   # 提取 列表页中的 详情页链接,并逐一分析
   for 详情页面链接 in 输出图书列表中的详情链接(bs):
    图书信息 = 获取图书详情(详情页面链接)
    # 得到的图书信息,按照自己的需求去处理吧
    print(图书信息)
    # 抓完一本书休息一下
    time.sleep(0.1)

   print('✅ 第%s页获取完毕\n\t' %(页序号 + 1))
  else:
   print('❌ 第%s页获取出错\n\t' %(页序号 + 1))

if __name__ == '__main__':
 # 默认图书列表起始页 和 终止页
 起始图书列表页码 = 1
 终止图书列表页码 = 2 # ⚠️ 改改代码页可以实现自动获得最后一页 

 # 获取输入参数; ⚠️此处未对输入参数的类型做检测
 if(len(sys.argv)==2):
  # 只有一个参数时,输入的是终止页码,起始页码默认为 0
  终止图书列表页码 = int(sys.argv[1])
 if(len(sys.argv)==3):
  # 有两个参数时, 第一个参数是起始页码,第二个参数是终止页码
  起始图书列表页码 = int(sys.argv[1])
  终止图书列表页码 = int(sys.argv[2])

 解析图书列表页(起始图书列表页码, 终止图书列表页码)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python os模块介绍
Nov 30 Python
Python中的高级数据结构详解
Mar 27 Python
在Python中用split()方法分割字符串的使用介绍
May 20 Python
Python中 传递值 和 传递引用 的区别解析
Feb 22 Python
Python 中字符串拼接的多种方法
Jul 30 Python
Python将string转换到float的实例方法
Jul 29 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
python抓取多种类型的页面方法实例
Nov 20 Python
Tensorflow之MNIST CNN实现并保存、加载模型
Jun 17 Python
python实现猜数游戏(保存游戏记录)
Jun 22 Python
python自动提取文本中的时间(包含中文日期)
Aug 31 Python
搭建pypi私有仓库实现过程详解
Nov 25 Python
使用python获取邮箱邮件的设置方法
Sep 20 #Python
Python中的上下文管理器相关知识详解
Sep 19 #Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 #Python
pandas read_excel()和to_excel()函数解析
Sep 19 #Python
python openvc 裁剪、剪切图片 提取图片的行和列
Sep 19 #Python
vscode 配置 python3开发环境的方法
Sep 19 #Python
python实现简易学生信息管理系统
Apr 05 #Python
You might like
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
js 日期转换成中文格式的函数
2009/07/07 Javascript
jquery常用技巧及常用方法列表集合
2011/04/06 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
2019/04/29 NodeJs
详解vue 图片上传功能
2019/04/30 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
详解在Python中处理异常的教程
2015/05/24 Python
python和flask中返回JSON数据的方法
2018/03/26 Python
python 如何对logging日志封装
2020/12/02 Python
CSS3 3D位移translate效果实例介绍
2016/05/03 HTML / CSS
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
英国独特礼物想法和个性化礼物网站:notonthehighstreet.com
2018/04/16 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
什么是事务?事务有哪些性质?
2012/03/11 面试题
机电系毕业生求职信
2014/07/11 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书
2019各种承诺书范文
2019/06/24 职场文书
2019中秋节祝福语大全,提前收藏啦
2019/09/10 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
用Python创建简易网站图文教程
2021/06/11 Python
python数据可视化使用pyfinance分析证券收益示例详解
2021/11/20 Python