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 相关文章推荐
在win和Linux系统中python命令行运行的不同
Jul 03 Python
从0开始的Python学习014面向对象编程(推荐)
Apr 02 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
Django 重写用户模型的实现
Jul 29 Python
python 列表、字典和集合的添加和删除操作
Dec 16 Python
Python通过Tesseract库实现文字识别
Mar 05 Python
python自动脚本的pyautogui入门学习
Apr 01 Python
Python同时处理多个异常的方法
Jul 28 Python
详解Pycharm第三方库的安装及使用方法
Dec 29 Python
python实现无边框进度条的实例代码
Dec 30 Python
python 基于UDP协议套接字通信的实现
Jan 22 Python
python如何在word中存储本地图片
Apr 07 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
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
php生成数组的使用示例 php全组合算法
2014/01/16 PHP
ThinkPHP关于session的操作方法汇总
2014/07/18 PHP
深入浅析php json 格式控制
2015/12/24 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
js 格式化时间日期函数小结
2010/03/20 Javascript
javascript 精粹笔记
2010/05/09 Javascript
zShowBox 图片放大展示jquery版 兼容性
2011/09/24 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
python PrettyTable模块的安装与简单应用
2019/01/11 Python
对Python3 goto 语句的使用方法详解
2019/02/16 Python
Python里字典的基本用法(包括嵌套字典)
2019/02/27 Python
Python实现Restful API的例子
2019/08/31 Python
利用python汇总统计多张Excel
2020/09/22 Python
外贸业务员岗位职责
2013/11/24 职场文书
给物业的表扬信
2014/01/21 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
计算机科学系职业生涯规划书
2014/03/08 职场文书
战友聚会主持词
2014/04/02 职场文书
投资建议书模板
2014/05/12 职场文书
铣工实训报告
2014/11/05 职场文书
退休欢送会主持词
2015/07/01 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
Nebula Graph解决风控业务实践
2022/03/31 MySQL