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使用Queue在多个子进程间交换数据的方法
Apr 18 Python
Python中关于使用模块的基础知识
May 24 Python
Python中数字以及算数运算符的相关使用
Oct 12 Python
python实现颜色空间转换程序(Tkinter)
Dec 31 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
Nov 22 Python
python数字图像处理实现直方图与均衡化
May 04 Python
python删除本地夹里重复文件的方法
Nov 19 Python
Python socket非阻塞模块应用示例
Sep 12 Python
python 哈希表实现简单python字典代码实例
Sep 27 Python
【超详细】八大排序算法的各项比较以及各自特点
Mar 31 Python
python 详解turtle画爱心代码
Feb 15 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循环获取GET和POST值的代码
2008/04/09 PHP
Cakephp 执行主要流程
2010/03/24 PHP
php实现分页工具类分享
2014/01/09 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
2016/06/15 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
PHP重载基础知识回顾
2020/09/10 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
Jquery 高亮显示文本中重要的关键字
2009/12/24 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
浏览器解析js生成的html出现样式问题的解决方法
2012/04/16 Javascript
jquery监听div内容的变化具体实现思路
2013/11/04 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
2015/08/17 Javascript
所见即所得的富文本编辑器bootstrap-wysiwyg使用方法详解
2016/05/27 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
2019/10/12 jQuery
JS实现普通轮播图特效
2020/01/01 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
Django自定义manage命令实例代码
2018/02/11 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
美国知名的在线旅游服务网站:Priceline
2016/07/23 全球购物
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
一套软件测试笔试题
2014/07/25 面试题
社会学专业学生职业规划书
2014/02/07 职场文书
运动会演讲稿300字
2014/08/25 职场文书
遗嘱格式范本
2015/08/07 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
MySQL三种方式实现递归查询
2022/04/18 MySQL