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编程中的异常处理教程
Aug 21 Python
python利用OpenCV2实现人脸检测
Apr 16 Python
Python smtplib实现发送邮件功能
May 22 Python
python3.x实现发送邮件功能
May 22 Python
TensorFlow 模型载入方法汇总(小结)
Jun 19 Python
浅析python 中大括号中括号小括号的区分
Jul 29 Python
Python基于类路径字符串获取静态属性
Mar 12 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
Python如何将将模块分割成多个文件
Aug 04 Python
Python自动发送和收取邮件的方法
Aug 12 Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 Python
python 三种方法提取pdf中的图片
Feb 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
WINDOWS 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
提高PHP编程效率的方法
2013/11/07 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
解决php extension 加载顺序问题
2019/08/16 PHP
解决Extjs上传图片无法预览的解决方法
2012/03/22 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
初步了解javascript面向对象
2015/11/09 Javascript
Javascript的表单验证长度
2016/03/16 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
深入Vue-Router路由嵌套理解
2018/08/13 Javascript
详解vue中使用vue-quill-editor富文本小结(图片上传)
2019/04/24 Javascript
微信小程序 网络通信实现详解
2019/07/23 Javascript
[01:46]2020完美世界全国高校联赛秋季赛报名开启
2020/10/15 DOTA
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
Python+OpenCV实现图像融合的原理及代码
2018/12/03 Python
python的命名规则知识点总结
2019/10/04 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
解决Pymongo insert时会自动添加_id的问题
2020/12/05 Python
Django中ORM的基本使用教程
2020/12/22 Python
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
动漫设计与制作专业推荐信
2014/07/07 职场文书
2014年环保工作总结
2014/11/26 职场文书
2014年绿化工作总结
2014/12/09 职场文书
先进教师个人总结
2015/02/11 职场文书
2015年中学图书馆工作总结
2015/07/22 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
课文《燕子》教学反思
2016/02/17 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python
python异步的ASGI与Fast Api实现
2021/07/16 Python