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编程之多态用法实例详解
May 19 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
Empty test suite.(PyCharm程序运行错误的解决方法)
Nov 30 Python
python 图像平移和旋转的实例
Jan 10 Python
详解python编译器和解释器的区别
Jun 24 Python
python实现自动化上线脚本的示例
Jul 01 Python
python判断自身是否正在运行的方法
Aug 08 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
基于h5py的使用及数据封装代码
Dec 26 Python
使用Python合成图片的实现代码(图片添加个性化文本,图片上叠加其他图片)
Apr 30 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 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 全文搜索和替换的实现代码
2008/07/29 PHP
PHP文件操作实现代码分享
2011/09/01 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
javascript中创建对象的三种常用方法
2010/12/30 Javascript
javascript开发技术大全-第3章 js数据类型
2011/07/03 Javascript
腾讯UED 漂亮的提示信息效果代码
2011/09/12 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
JavaScript判断一个字符串是否包含指定子字符串的方法
2015/03/18 Javascript
JavaScript中使用sencha gridpanel 编辑单元格、改变单元格颜色
2015/11/26 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
利用vue + element实现表格分页和前端搜索的方法
2017/12/25 Javascript
vue中element组件样式修改无效的解决方法
2018/02/03 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
vue v-model的用法解析
2020/10/19 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
Python通过poll实现异步IO的方法
2015/06/04 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
Python 实现域名解析为ip的方法
2019/02/14 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
美国领先的宠物用品和宠物食品零售商:Petco
2020/10/28 全球购物
安全生产投入制度
2014/01/29 职场文书
面试后感谢信
2014/02/01 职场文书
军人违纪检讨书
2014/02/04 职场文书
好人好事事迹材料
2014/02/12 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
房屋租房协议书范本
2014/12/04 职场文书
病危通知单
2015/04/17 职场文书
聊聊Python String型列表求最值的问题
2022/01/18 Python
SONY600GR,国产收音机厂商永远的痛
2022/04/05 无线电