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实现GUI学生信息管理系统
Apr 05 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
python使用threading.Condition交替打印两个字符
May 07 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
Python实现的远程文件自动打包并下载功能示例
Jul 12 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
python一些性能分析的技巧
Aug 30 Python
Prometheus开发中间件Exporter过程详解
Nov 30 Python
Python Pygame实战之塔防游戏的实现
Mar 17 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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 has encountered an Access Violation
2007/01/15 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
JavaScript 变量命名规则
2009/09/23 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
Javascript函数式编程语言
2015/10/11 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
全面解析JavaScript的Backbone.js框架中的Router路由
2016/05/05 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
js实现自动图片轮播代码
2017/03/22 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
JS实现打字游戏
2019/12/17 Javascript
vue-cli3配置favicon.ico和title的流程
2020/10/27 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
js前端对于大量数据的展示方式及处理方法
2020/12/02 Javascript
在服务器端实现无间断部署Python应用的教程
2015/04/16 Python
Python Flask-web表单使用详解
2017/11/18 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
python接入支付宝的实例操作
2020/07/20 Python
大专应届生个人简历的自我评价
2013/10/15 职场文书
杠杆的科学教学反思
2014/01/10 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
幼儿老师求职信
2014/06/30 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
2016校本研修培训心得体会
2016/01/08 职场文书