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 27 Python
深入了解Python数据类型之列表
Jun 24 Python
Python文本相似性计算之编辑距离详解
Nov 28 Python
python实现读Excel写入.txt的方法
Apr 29 Python
Python subprocess模块常见用法分析
Jun 12 Python
把pandas转换int型为str型的方法
Jan 29 Python
在Python中预先初始化列表内容和长度的实现
Nov 28 Python
Python高阶函数、常用内置函数用法实例分析
Dec 26 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
Python使用type动态创建类操作示例
Feb 29 Python
Python3爬虫中pyspider的安装步骤
Jul 29 Python
基于python调用jenkins-cli实现快速发布
Aug 14 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
apache配置虚拟主机的方法详解
2013/06/17 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
js创建数据共享接口——简化框架之间相互传值
2011/10/23 Javascript
jquery加载图片时以淡入方式显示的方法
2015/01/14 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
node-http-proxy修改响应结果实例代码
2016/06/06 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
javascript表单正则应用
2017/02/04 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
python 判断自定义对象类型
2009/03/21 Python
pyqt和pyside开发图形化界面
2014/01/22 Python
python分析nignx访问日志脚本分享
2015/02/26 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
python 阶乘累加和的实例
2019/02/01 Python
Pandas读写CSV文件的方法示例
2019/03/27 Python
python3下载抖音视频的完整代码
2019/06/05 Python
pandas分组聚合详解
2020/04/10 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
P D PAOLA法国官网:西班牙著名的珠宝首饰品牌
2020/02/15 全球购物
国培远程培训感言
2014/03/08 职场文书
捐助倡议书范文
2014/04/15 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
离职保密承诺书
2014/05/28 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
2015年女职工工作总结
2015/05/15 职场文书
严以修身专题学习研讨会发言材料
2015/11/09 职场文书