python通过链接抓取网站详解


Posted in Python onNovember 20, 2019

在本篇文章里,你将会学习把这些基本方法融合到一个更灵活的网站 爬虫中,该爬虫可以跟踪任意遵循特定 URL 模式的链接。

这种爬虫非常适用于从一个网站抓取所有数据的项目,而不适用于从特 定搜索结果或页面列表抓取数据的项目。它还非常适用于网站页面组织 得很糟糕或者非常分散的情况。

这些类型的爬虫并不需要像上一节通过搜索页面进行抓取中采用的定位 链接的结构化方法,因此在 Website 对象中不需要包含描述搜索页面 的属性。但是由于爬虫并不知道待寻找的链接的位置,所以你需要一些 规则来告诉它选择哪种页面。你可以用 targetPattern(目标 URL 的 正则表达式)和布尔变量 absoluteUrl 来达成这一目标:

class Website:  
def __init__(self, name, url, targetPattern, absoluteUrl,    
titleTag, bodyTag):    
self.name = name    
self.url = url    
self.targetPattern = targetPattern    
self.absoluteUrl=absoluteUrl    
self.titleTag = titleTag    
self.bodyTag = bodyTag
class Content:  
def __init__(self, url, title, body):    
self.url = url    
self.title = title    
self.body = body
def print(self):    
print("URL: {}".format(self.url))    
print("TITLE: {}".format(self.title))    
print("BODY:\n{}".format(self.body))

Content 类和第一个爬虫例子中使用的是一样的。

Crawler 类从每个网站的主页开始,定位内链,并解析在每个内链页面 发现的内容:

import re
class Crawler:  
def __init__(self, site):    
self.site = site    
self.visited = []
def getPage(self, url):    
try:
req = requests.get(url)    
except requests.exceptions.RequestException:      
return None
return BeautifulSoup(req.text, 'html.parser')
def safeGet(self, pageObj, selector):
selectedElems = pageObj.select(selector)
if selectedElems is not None and len(selectedElems) > 0:
return '\n'.join([elem.get_text() for
elem in selectedElems])
return ''
def parse(self, url):
bs = self.getPage(url)
if bs is not None:
title = self.safeGet(bs, self.site.titleTag)
body = self.safeGet(bs, self.site.bodyTag)
if title != '' and body != '':
content = Content(url, title, body)
content.print()
def crawl(self):
"""
获取网站主页的页面链接
"""
bs = self.getPage(self.site.url)
targetPages = bs.findAll('a',
href=re.compile(self.site.targetPattern))
for targetPage in targetPages:
targetPage = targetPage.attrs['href']
if targetPage not in self.visited:
self.visited.append(targetPage)
if not self.site.absoluteUrl:
targetPage = '{}{}'.format(self.site.url, targetPage)
self.parse(targetPage)
reuters = Website('Reuters', 'https://www.reuters.com', '^(/article/)', False,
'h1', 'div.StandardArticleBody_body_1gnLA') 
crawler = Crawler(reuters) 
crawler.crawl()

与前面的例子相比,这里的另外一个变化是:Website 对象(在这个例 子中是变量 reuters)是 Crawler 对象本身的一个属性。这样做的作 用是将已访问过的页面存储在爬虫中,但是也意味着必须针对每个网站 实例化一个新的爬虫,而不是重用一个爬虫去抓取网站列表。

不管你是选择一个与网站无关的爬虫,还是将网站作为爬虫的一个属 性,这都是一个需要根据自身需求进行权衡的决定。两种方法在功能实 现上都是没有问题的。

另外需要注意的是,这个爬虫会从主页开始抓取,但是在所有页面都被 记录后,就不会继续抓取了。你可能希望编写一个爬虫,将第 3 章中介 绍的某种模式融合进来,然后查看所访问的每个页面中更多的目标 URL。你甚至还可以跟踪每个页面中涉及的所有 URL(不仅仅是匹配 目标模式的 URL),然后查看这些 URL 是否包含目标模式。

以上就是关于python抓取网站的相关知识点内容,感谢大家的学习和对三水点靠木的支持。

Python 相关文章推荐
Python的Tornado框架异步编程入门实例
Apr 24 Python
Python3使用requests登录人人影视网站的方法
May 11 Python
解析Python中的__getitem__专有方法
Jun 27 Python
Python中模块string.py详解
Mar 12 Python
Python实现OpenCV的安装与使用示例
Mar 30 Python
python如何保证输入键入数字的方法
Aug 23 Python
下载官网python并安装的步骤详解
Oct 12 Python
Python csv文件的读写操作实例详解
Nov 19 Python
python常用运维脚本实例小结
Feb 14 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
Python变量及数据类型用法原理汇总
Aug 06 Python
Python中的 Set 与 dict
Mar 13 Python
python爬虫之遍历单个域名
Nov 20 #Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 #Python
python中Lambda表达式详解
Nov 20 #Python
TensorFlow索引与切片的实现方法
Nov 20 #Python
50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)
Nov 20 #Python
python中必要的名词解释
Nov 20 #Python
python做接口测试的必要性
Nov 20 #Python
You might like
php的控制语句
2006/10/09 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
Yii1.1中通过Sql查询进行的分页操作方法
2017/03/16 PHP
php生出随机字符串
2017/07/06 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
jquery 圆形旋转图片滚动切换效果
2011/01/19 Javascript
jquery得到font-size属性值实现代码
2013/09/30 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
整理Javascript基础入门学习笔记
2015/11/29 Javascript
jQuery Validation PlugIn的使用方法详解
2015/12/18 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
原生js轮播(仿慕课网)
2017/02/15 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
vue.js表单验证插件(vee-validate)的使用教程详解
2019/05/23 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
jQuery擦除插件eraser使用方法详解
2020/01/11 jQuery
不依任何赖第三方,单纯用vue实现Tree 树形控件的案例
2020/09/21 Javascript
[01:55]2014DOTA2国际邀请赛快报:国土生病 紧急去医院治疗
2014/07/10 DOTA
[01:34]DAC2018主赛事第四日五佳镜头 Gh巨牙海民助Miracle-死里逃生
2018/04/07 DOTA
[01:03:27]NAVI vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python的dict,set,list,tuple应用详解
2014/07/24 Python
用python与文件进行交互的方法
2018/03/01 Python
在pycharm上mongodb配置及可视化设置方法
2018/11/30 Python
python selenium firefox使用详解
2019/02/26 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
年会搞笑主持词
2014/03/27 职场文书
幼儿园安全工作总结2015
2015/04/20 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python