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中的高级数据结构详解
Mar 27 Python
在Python中操作字符串之startswith()方法的使用
May 20 Python
利用python批量检查网站的可用性
Sep 09 Python
Python的IDEL增加清屏功能实例
Jun 19 Python
Python模拟随机游走图形效果示例
Feb 06 Python
TensorFlow中权重的随机初始化的方法
Feb 11 Python
Centos7 Python3下安装scrapy的详细步骤
Mar 15 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
python实现汽车管理系统
Nov 30 Python
使用Pandas对数据进行筛选和排序的实现
Jul 29 Python
Tensorflow tensor 数学运算和逻辑运算方式
Jun 30 Python
selenium自动化测试入门实战
Dec 21 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
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
2015/05/11 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
用javascript自动显示最后更新时间
2007/03/15 Javascript
Javascript 获取LI里的内容
2008/12/17 Javascript
浅析onsubmit校验表单时利用ajax的return false无效问题
2013/07/10 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
JS定时器实现数值从0到10来回变化
2016/12/09 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
探索Vue高阶组件的使用
2018/01/08 Javascript
微信小程序实现流程进度的图样式功能
2018/01/16 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
微信小程序日历插件代码实例
2019/12/04 Javascript
VSCode launch.json配置详细教程
2020/06/18 Javascript
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
python实现AES加密与解密
2019/03/28 Python
pybind11在Windows下的使用教程
2019/07/04 Python
python @classmethod 的使用场合详解
2019/08/23 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
2020/06/05 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
澳大利亚在线家具、灯饰和家居装饰店:LivingStyles
2018/11/20 全球购物
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
青年教师培训方案
2014/02/06 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
用position:sticky完美解决小程序吸顶问题的实现方法
2021/04/24 HTML / CSS
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python