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登录QQ邮箱发信的实现代码
Feb 10 Python
用Python编程实现语音控制电脑
Apr 01 Python
跟老齐学Python之dict()的操作方法
Sep 24 Python
python通过floor函数舍弃小数位的方法
Mar 17 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
numpy数组拼接简单示例
Dec 15 Python
Python代码实现KNN算法
Dec 20 Python
使用PyTorch实现MNIST手写体识别代码
Jan 18 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
May 22 Python
Python3中对json格式数据的分析处理
Jan 28 Python
教你怎么用Python实现GIF动图的提取及合成
Jun 15 Python
python 远程执行命令的详细代码
Feb 15 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中读写文件实现代码
2011/10/20 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
jquery 新建的元素事件绑定问题解决方案
2014/06/12 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
微信小程序如何获知用户运行小程序的场景教程
2017/05/17 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
angular中的post请求处理示例详解
2020/06/30 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
python改变日志(logging)存放位置的示例
2014/03/27 Python
整理Python中的赋值运算符
2015/05/13 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
深入浅析Python 中的sklearn模型选择
2019/10/12 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
2020/03/12 Python
详解Python 循环嵌套
2020/07/09 Python
Python Selenium模块安装使用教程详解
2020/07/09 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
工作失误检讨书范文大全
2014/01/13 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
2014年办公室工作总结范文
2014/11/12 职场文书
工程部经理岗位职责
2015/02/02 职场文书
四群教育工作总结
2015/08/10 职场文书
商业计划书格式、范文
2019/03/21 职场文书
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python