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 IDLE加上自动补全和历史功能
Nov 30 Python
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 Python
Python实现Windows上气泡提醒效果的方法
Jun 03 Python
详解Django缓存处理中Vary头部的使用
Jul 24 Python
python 实现GUI(图形用户界面)编程详解
Jul 17 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
Aug 31 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
Oct 28 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
Python selenium自动化测试模型图解
Apr 15 Python
python 使用多线程创建一个Buffer缓存器的实现思路
Jul 02 Python
python两种获取剪贴板内容的方法
Nov 06 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实现读取和编写XML DOM代码
2010/04/07 PHP
50个PHP程序性能优化的方法
2014/06/02 PHP
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
详解PHP队列的实现
2019/03/14 PHP
jquery.validate使用攻略 第一部
2010/07/01 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
js获取form的方法
2015/05/06 Javascript
Javascript对象字面量的理解
2016/06/22 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
node内置调试方法总结
2018/02/22 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
vue实现几秒后跳转新页面代码
2020/09/09 Javascript
[03:26]回顾2015国际邀请赛中国区预选赛
2015/06/09 DOTA
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
Python Selenium库的基本使用教程
2021/01/04 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
HTML5声音录制/播放功能的实现代码
2018/05/03 HTML / CSS
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
花店创业计划书范文
2014/02/07 职场文书
总裁助理岗位职责
2014/02/17 职场文书
党员一句话承诺大全
2014/03/28 职场文书
个人授权委托书范本
2014/04/03 职场文书
幸福家庭标语
2014/06/27 职场文书
财务稽核岗位职责
2015/04/13 职场文书
2016年秋季开学典礼新闻稿
2015/11/25 职场文书
SQL Server实现分页方法介绍
2022/03/16 SQL Server
MySql统计函数COUNT的具体使用详解
2022/08/14 MySQL