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实现的解析crontab配置文件代码
Jun 30 Python
Python socket C/S结构的聊天室应用实现
Nov 30 Python
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 Python
Python键盘输入转换为列表的实例
Jun 23 Python
python计算两个矩形框重合百分比的实例
Nov 07 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
python远程邮件控制电脑升级版
May 23 Python
使用python获取(宜宾市地震信息)地震信息
Jun 20 Python
django框架面向对象ORM模型继承用法实例分析
Jul 29 Python
哪些是python中web开发框架
Jun 17 Python
Django自定义YamlField实现过程解析
Nov 11 Python
浅析Python OpenCV三种滤镜效果
Apr 11 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生成xml简单实例代码
2009/12/16 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
js removeChild 障眼法 可能出现的错误
2009/10/06 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
JavaScript类属性的访问方式详解
2014/02/11 Javascript
jQuery左侧大图右侧小图焦点图幻灯切换代码分享
2015/08/19 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
angular json对象push到数组中的方法
2018/02/27 Javascript
JavaScript闭包原理与用法实例分析
2018/08/10 Javascript
使用ECharts实现状态区间图
2018/10/25 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
Python绘图之二维图与三维图详解
2020/08/04 Python
HTML5 Canvas 起步(1) - 基本概念
2009/05/12 HTML / CSS
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
开业典礼主持词
2014/03/21 职场文书
借款担保书范文
2014/05/13 职场文书
高一军训的心得体会
2014/09/01 职场文书
篮球友谊赛通讯稿
2014/10/10 职场文书
个人务虚会发言材料
2014/10/20 职场文书
美术教师求职信范文
2015/03/20 职场文书
2015年司法所工作总结
2015/04/27 职场文书
2015年暑假生活总结
2015/07/13 职场文书
五一放假通知怎么写
2015/08/18 职场文书