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实现文件路径和url相互转换的方法
Jul 06 Python
深入理解Python中字典的键的使用
Aug 19 Python
Python爬虫实例爬取网站搞笑段子
Nov 08 Python
Tensorflow实现卷积神经网络的详细代码
May 24 Python
python利用百度AI实现文字识别功能
Nov 27 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
详解在Python中以绝对路径或者相对路径导入文件的方法
Aug 30 Python
淘宝秒杀python脚本 扫码登录版
Sep 19 Python
Python 中如何实现参数化测试的方法示例
Dec 10 Python
postman和python mock测试过程图解
Feb 22 Python
python logging.info在终端没输出的解决
May 12 Python
Python中相见恨晚的技巧
Apr 13 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
WIN98下Apache1.3.14+PHP4.0.4的安装
2006/10/09 PHP
php 调试利器debug_print_backtrace()
2012/07/23 PHP
php抽奖小程序的实现代码
2013/06/18 PHP
解析php中获取url与物理路径的总结
2013/06/21 PHP
php中apc缓存使用示例
2013/12/25 PHP
PHP处理Oracle的CLOB实例
2014/11/03 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
分享一个自己写的table表格排序js插件(高效简洁)
2011/10/29 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
JS操作XML实例总结(加载与解析XML文件、字符串)
2015/12/08 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
Javascript动画效果(2)
2016/10/11 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
Vue使用lodop实现打印小结
2019/07/06 Javascript
JavaScript实现英语单词题库
2019/12/24 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
[38:39]完美世界DOTA2联赛循环赛 IO vs GXR BO2第二场 11.04
2020/11/05 DOTA
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
python进程和线程用法知识点总结
2019/05/28 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
python中树与树的表示知识点总结
2019/09/14 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
美国在线宠物商店:Chewy
2019/01/12 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
如何写出高质量、高性能的MySQL查询
2014/11/17 面试题
办理生育手续介绍信
2014/01/14 职场文书
师德师风个人自我剖析材料
2014/09/27 职场文书
辩论赛主持人开场白
2015/05/29 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers