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 相关文章推荐
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
Python3里的super()和__class__使用介绍
Apr 23 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 Python
python ipset管理 增删白名单的方法
Jan 14 Python
Python多线程及其基本使用方法实例分析
Oct 29 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
Feb 17 Python
基于Python pyecharts实现多种图例代码解析
Aug 10 Python
python利用tkinter实现图片格式转换的示例
Sep 28 Python
python 如何对logging日志封装
Dec 02 Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 24 Python
python实现Thrift服务端的方法
Apr 20 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
一个从别的网站抓取信息的例子(域名查询)
2006/10/09 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
JavaScript的目的分析
2007/01/05 Javascript
使用prototype.js进行异步操作
2007/02/07 Javascript
document.execCommand()的用法小结
2014/01/08 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
2014/10/21 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
JavaScript判断表单提交时哪个radio按钮被选中的方法
2015/03/21 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
JS判断元素是否在数组内的实现代码
2016/03/30 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
详解使用Node.js 将txt文件转为Excel文件
2017/07/05 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
nodejs express配置自签名https服务器的方法
2018/05/22 NodeJs
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
python回调函数的使用方法
2014/01/23 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
python爬取m3u8连接的视频
2018/02/28 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
Python实现多线程的两种方式分析
2018/08/29 Python
django解决跨域请求的问题
2018/11/11 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
2019/06/04 Python
python的launcher用法知识点总结
2020/08/07 Python
python 实现波浪滤镜特效
2020/12/02 Python
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
MySQL面试题
2014/01/12 面试题
介绍一下你对SOA的认识
2016/04/24 面试题
师范生实习的个人自我鉴定
2013/10/20 职场文书
运动会通讯稿100字
2014/01/31 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
2015年依法行政工作总结
2015/04/29 职场文书