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 相关文章推荐
简单介绍利用TK在Python下进行GUI编程的教程
Apr 13 Python
Python的多态性实例分析
Jul 07 Python
Python程序中的观察者模式结构编写示例
May 27 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
python实现图片批量压缩程序
Jul 23 Python
Python实现常见的回文字符串算法
Nov 14 Python
python替换字符串中的子串图文步骤
Jun 19 Python
python3 下载网络图片代码实例
Aug 27 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
Python如何使用vars返回对象的属性列表
Oct 17 Python
python playwright之元素定位示例详解
Jul 23 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
php计算数组不为空元素个数的方法
2014/01/27 PHP
php上传图片并压缩的实现方法
2015/12/22 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
javascript基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
2008/08/05 Javascript
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
JS delegate与live浅析
2013/12/21 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
2014/03/19 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
2014/09/25 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
基于JS实现EOS隐藏错误提示层代码
2016/04/25 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
checkbox:click事件触发span元素内容改变的方法
2017/09/11 Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
2017/09/11 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
2018/09/28 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
vue实现简单瀑布流布局
2020/05/28 Javascript
JavaScript运行机制实例分析
2020/04/11 Javascript
Python代码的打包与发布详解
2014/07/30 Python
python元组操作实例解析
2014/09/23 Python
python实现12306火车票查询器
2017/04/20 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
python skimage 连通性区域检测方法
2018/06/21 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
Oracle中delete,truncate和drop的区别
2016/05/05 面试题
机电一体化专业应届本科生求职信
2013/09/27 职场文书
打架检讨书50字
2014/01/11 职场文书
加薪申请报告范本
2015/05/15 职场文书
消防验收申请报告
2015/05/15 职场文书
CSS 伪元素::marker详解
2021/06/26 HTML / CSS
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js