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实现删除列表中满足一定条件的元素示例
Jun 12 Python
Python利用BeautifulSoup解析Html的方法示例
Jul 30 Python
python图像常规操作
Nov 11 Python
python实现教务管理系统
Mar 12 Python
pandas通过索引进行排序的示例
Nov 16 Python
Pycharm以root权限运行脚本的方法
Jan 19 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 Python
Django后台管理系统的图文使用教学
Jan 20 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
Apr 16 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
python读取图像矩阵文件并转换为向量实例
Jun 18 Python
Python手动或自动协程操作方法解析
Jun 22 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
中东人咖啡哲学
2021/03/03 咖啡文化
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
smarty静态实验表明,网络上是错的~呵呵
2006/11/25 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
PHP安全之register_globals的on和off的区别
2020/07/23 PHP
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
jQuery中add实现同时选择两个id对象
2010/10/22 Javascript
jquery实现背景墙聚光灯效果示例分享
2014/03/02 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
2014/10/31 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
python中的对象拷贝示例 python引用传递
2014/01/23 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
python实现两张图片的像素融合
2019/02/23 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
CSS3 简写animation
2012/05/10 HTML / CSS
全球最大的房车租赁市场:Outdoorsy
2018/09/19 全球购物
阿迪达斯印尼官方网站:adidas印尼
2020/02/10 全球购物
医德医风演讲稿
2014/05/20 职场文书
环保小标语
2014/06/13 职场文书
年检委托书
2014/08/30 职场文书
2014年六五普法工作总结
2014/11/25 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
行政介绍信范文
2015/05/04 职场文书
高中历史教学反思
2016/02/19 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书