python数据抓取
一、页面分析
二、网页抓取方法
1、正则表达式方法
2、BeautifulSoup 模块
3、lxml 模块
4、各方法的对比总结
三、Xpath选择器
四、CSS选择器
五、数据抓取总结
六、性能测试源码
一、页面分析
所谓的分析网页,就是理解一个网页的结构如何,了解需要字段的位置和形式。方便后期提取。了解页面最好的方法就是查看源代码。在大多数浏览器中,都可以使用开发者工具或者直接按F12,获取网页的源代码,下面以之前的文章做个示例: 上面例子中,很容易找到我们想要的阅读数和收藏数,只有这样分析清楚了,你才在后面通过class="read-count"和class="get-collection"获得想要的数据。当然,实际中的数据肯定是相对复杂的,不像例子这个简单。
二、网页抓取方法
现在我们已经了解了该网页的结构,下面将会介绍 3 种抓取其中数据的方法。首先是正则表达式,然后是流行的 BeautifulSoup 模块,最后是强大的 lxml 模块。
1、正则表达式方法
在通过正则表达式进行示例之前,假设你已经知道并且会使用python的正则表达式进行简单的提取,当然,你不会也没关系,请查看笔者之前的文章python的正则表达式 进行学习。 好嘛,相信你又温习了一下正则的使用,下面通过一个例子了解正则表达式在数据抓取时的方法。
例子:抓取文章的阅读数
url = 'https://blog.csdn.net/Itsme_MrJJ/article/details/124836797'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'}
res = requests.get(url, headers=headers)
pattern = re.compile(r'class="read-count">(.*?)<')
read_count = re.findall(pattern,res.text)
read_count
['60']
可以看到,我们需要的数据已经获取到了,但是需要说明已下几个问题;
上例使用的时findall,其他也可以获得结果,但实际中的抓取数据不止一个,所以都用findall
实际中,网页页面会变化,导致数据抓取不到,需要重新修改正则匹配规则
正则找规律相对复杂,尤其是页面复杂、提取的数据很多时
2、BeautifulSoup 模块
Beautiful Soup 是一个非常流行的 Python 库,它可以解析网页,并提供了定位内容的便捷接口。当然,如果你还不知道,那么请看笔者之前的文章BeautifulSoup解析网页 ,当然也可以直接查看其官方文档。
好的,假设你已经安装、了解BeautifulSoup 模块了,并通过里面的讲解,知道了大概的html的结构释义,那么请接着看下面通过BeautifulSoup 模块获取阅读数的例子。
url = 'https://blog.csdn.net/Itsme_MrJJ/article/details/124836797'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.text,features="lxml")
soup.find_all(class_='read-count')[0].string
'60'
同样的,我们通过上面的例子也得到了想要的数据,而且比之前的正则表达式简洁了很多且抗干扰能力(前端编写时乱用的空格等)强了很多。但它也有一些需要注意的地方。
该模块可以使用多个解析内核,之间又些许差异,使用时需要注意
soup的定位又多种,也时根据哪种得心应手用哪种,其中遍历树最麻烦,且往往得不到想要的
改模块会补充、规范不规整的前端页面
3、lxml 模块
Lxml 是基于 libxml2 这一 XML 解析库构建的 Python 库,它使用 C 语言编写,解析速度比 Beautiful Soup 更快,不过安装过程也更为复杂,尤其是在 Windows中。若是安装未成功,可以使用 Anaconda 。 当然,也许你可能对 Anaconda 不太熟悉,它是由 Continuum Analytics 公司员工创建的主要专注于开源数据科学包的包和环境管理器。可以直接去其官网下载安装。 和 Beautiful Soup 一样,使用 lxml 模块的第一步也是将有可能不合法的HTML 解析为统一格式。然后接着才是需求数据的抓取,对于数据的抓取,lxml 有几种不同的方法,比如 XPath 选择器和类似 Beautiful Soup 的 find()方法。但这里我们使用CSS 选择器。
from lxml.html import fromstring, tostring
tree = fromstring(res.text) # parse the HTML
td = tree.cssselect('.read-count')[0]
td.text
'60'
由于 cssselect 返回的是一个列表,我们需要获取其中的第一个结果,并调用 text方法,以迭代所有子元素并返回每个元素的相关文本。在本例中,尽管我们只有一个元素,但是该功能对于更加复杂的抽取示例来说非常有用。
4、各方法的对比总结
关于每种抓取方法的优缺点。如下图:
如果对你来说速度不是问题,并且更希望只使用 pip 安装库的话,那么使用较慢的方法(如 Beautiful Soup)也不成问题,但其实也没那么慢 。如果只需抓取少量数据,并且想要避免额外依赖的话,那么正则表达式可能更加适合。不过,通常情况下,lxml 是抓取数据的最佳选择,这是因为该方法既快速又健壮,而正则表达式和 Beautiful Soup 或是速度不快,或是修改不易。
三、Xpath选择器
原本写到这里是要结束的,但是考虑涉及到的CSS选择器和Xpath选择器知识没涉及到,且我之前也没写相关的东西,所以,作为补充的知识点再写点。在开始之前,先看看常用的页面属性。
属性
示例
说明
id
id=“MathJax_Message”
id 属性在 HTML 文档中必须是唯一的,这类似于公民的身份证号,具有很强的唯一性
name
name=“keywords”
name 来指定元素的名称,像是人的姓名,不唯一
class
class=“read-count”
class 来指定元素的类名。其用法与 id、name 类似
tag
类似
link
link 定位与前面介绍的几种定位方法有所不同,它专门用来定位文本链接
XPath 是一种在 XML 文档中定位元素的语言。因为 HTML 可以看作 XML 的一种实现,所以我们可以通过Xpath定位抓取数据。 相比BeautifulSoup,xpath所需要的依赖更少,只需要lxml这个解析器就可。并且xpath也可以在java,c++等多种语言中使用,使得爬虫不再局限于python语言。而Xpath处理的对象是一个etree对象,该对象由lxml生成。有两种生成方式:
# 本地文件
from lxml import etree
# 实例化好了一个etree对象,且将被解析的源码加载到了该对象中
tree = etree.parse('alice.html')
# 网络文件
import requests
from lxml import etree
url = 'https://blog.csdn.net/Itsme_MrJJ/article/details/124836797'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'}
res = requests.get(url, headers=headers)
# 实例化好了一个etree对象,且将被解析的源码加载到了该对象中
tree = etree.HTML(res.text)
生成之后就是提取,xpath的常用规则及基本方法如下:
表达式
描述
nodename
选取此节点的所有子节点。
/
从根节点(标签)选取且必须从根节点开始
//
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.
选取当前节点。
..
选取当前节点的父节点。
@
选取属性。
from lxml import etree
import requests
url = 'https://blog.csdn.net/Itsme_MrJJ/article/details/124836797'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36'}
res = requests.get(url, headers=headers)
tree = etree.HTML(res.text)
tree.xpath('//span[@class="read-count"]/text()')
['61']
说明: //span[@class=“read-count”]:从class属性等于read-count的span节点开始的所有text 因为使用的是//,所以不必指出前面的层级,这也是Xpath的强大之处,不需要一层层的找
四、CSS选择器
CSS(Cascading Style Sheets)是一种语言,它用来描述 HTML 和 XML 文档的表现。CSS 使用选择器来为页面元素绑定属性。 CSS 可以较为灵活地选择控件的任意属性,一般情况下定位速度要比 XPath 快,但对于初学者来说学习起来稍微有点难度,我们这里只介绍 CSS 在BeautifulSoup中的语法与使用。
使用CSS选择器,只需要调用select()方法,并结合CSS选择器语法就可以定位元素的位置。具体语法规则如下表:
类型
表示
示例
说明
id选择器
#
soup.select(‘#content_views’)
选择id值为content_views的所有内容
类选择器
.
soup.select(‘.read-count’)
选择class值为read-count的所有内容
标签选择器
tag
soup.select(‘h1’)
选择所有h1标签的内容
混合选择器
综上
soup.select(‘span.read-count’)
选择class值为read-count的所有span标签数据
我们以已经了解了Xpath和CSS选择器,那两者关于定位的区别如下:
五、数据抓取总结
写了这么多,总感觉有些乱,做一个图来整理思绪。
六、性能测试源码
import re
import requests
from bs4 import BeautifulSoup
import lxml. html
import time
def download ( url, user_agent= 'wswp' , proxy= None , num_retries= 2 ) :
print ( 'Downloading:' , url)
headers = { 'User-Agent' : user_agent}
try :
resp = requests. get( url, headers= headers, proxies= proxy)
html = resp. text
if resp. status_code >= 400 :
print ( 'Download error:' , resp. text)
html = None
if num_retries and 500 <= resp. status_code < 600 :
return download( url, num_retries - 1 )
except requests. exceptions. RequestException as e:
print ( 'Download error:' , e. reason)
html = None
return html
def re_scraper ( html) :
results= { }
results[ 'area' ] = re. search( '.*?(.*?) ', html) . groups( ) [ 0 ]
return results
def bs_scraper ( html) :
soup= BeautifulSoup( html)
results= { }
results[ 'area' ] = soup. find( 'table' ) . find( 'tr' , id = 'places_area__row' ) . find( 'td' , class_= 'w2p_fw' ) . string
return results
def lxml_scraper ( html) :
tree= lxml. html. fromstring( html)
results= { }
conf= tree. cssselect( 'table > tr#places_area__row > td.w2p_fw' ) [ 0 ] . text_content( )
results[ 'area' ] = conf
return results
NUM_ITERATIONS= 1000
html= download( 'http://example.python-scraping.com/view/-1' )
for name, scraper in [ ( 'Re' , re_scraper) , ( 'Bs' , bs_scraper) , ( 'Lxml' , lxml_scraper) ] :
start= time. time( )
for i in range ( NUM_ITERATIONS) :
if scraper== re_scraper:
re. purge( )
result= scraper( html)
assert ( result[ 'area' ] == '647,500 square kilometres' )
end= time. time( )
print ( '%s: %.2f seconds' % ( name, end- start) )
你可能感兴趣的:(python,爬虫,正则表达式)
python基础笔记
大大的大大
笔记 python 前端 数据库
输入就是print();#括号里面双引号(“xxxx”)=单引号('xxxx')必须在一行;但是三引号"""xxxx"""='''xxx'''可以换行输出;#'''xxxnnn'''xx=open(('C:\py\py笔记.txt','a+')print('hello',file=xx)xx.close()可以在python中新建文本文本档等(看后缀):"xx"=open('C:\py\py笔记.
python venv不适合变更路径(路径变更)的几种解决方案(venvpack、pip download、pip install --no-index --find-links=packages)
文章目录**为什么会出现路径问题?**1.**`pyvenv.cfg`文件**:该文件记录了虚拟环境的Python解释器路径(`home`字段)。如果源和目标机器的Python安装路径不一致,虚拟环境将无法找到正确的解释器。2.**脚本路径硬编码**:虚拟环境中的激活脚本(如`activate`)和可执行文件(如`python`)可能包含绝对路径或硬编码的相对路径,导致路径不匹配时失效。**解决方
python-程序编程-实例“温度转换”
实例:温度刻画的两种不同的体系。摄氏度、华氏度需求:将两种不同的摄氏度进行转换。问题分析:输入:输入一个华氏度的温度或者摄氏度的温度值处理:根据温度标志进行温度转换。输出:输出一个带华氏度或者摄氏度的温度值。(f代表华氏度,c代表是摄氏度)c=(f-32)/1.8f=c*1.8+32代码如下:temp=input("请输入有符号的温度值")iftemp[-1]in['f','F']:c=(eval
基于Docker构建Python后端项目落地总结
Docker使用总结基于Dockerfile的镜像构建示例dockerfile解析#加载centos7的最小镜像源FROMcentos:7RUNyumcleanallRUNyum-yupdate#修改时区RUNln-sf/usr/share/zoneinfo/Asia/Shanghai/etc/localtime&&echo"Asia/Shanghai">/etc/timezone#安装中文支持R
python集合常用函数
Lo-Y-eH
python
Python集合是一种无序、可变且不重复的数据类型,常用于处理一组唯一的数据。下面是常用的Python集合函数及其用法:add():向集合添加一个元素。s=set()s.add(1)s.add(2)s.add(3)print(s)#输出{1,2,3}clear():移除集合中的所有元素。s=set([1,2,3])s.clear()print(s)#输出set()copy():返回集合的一个浅拷贝
【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 基于wordcloud库实现词云图
大家好,我是java1234_小锋老师,最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts)视频教程,持续更新中,计划月底更新完,感谢支持。今天讲解基于wordcloud库实现词云图视频在线地址:2026版【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts+爬虫)视频教程(火爆连载更新中..
Python领域制造业的Python应用
Python编程之道
Python编程之道 python 开发语言 ai
Python在制造业中的应用:从自动化到智能制造关键词:Python、制造业、工业自动化、数据分析、机器学习、物联网、智能制造摘要:本文深入探讨Python编程语言在制造业中的广泛应用。从基础的自动化脚本到复杂的智能制造系统,Python凭借其丰富的库生态系统和易用性,正在重塑现代制造业。我们将分析Python在制造业中的核心应用场景,包括设备监控、质量控制、预测性维护和供应链优化等,并通过实际案
Python 爬虫实战:自动化获取学术会议数据(会议安排、论文提交等)
Python爬虫项目
python 爬虫 自动化 智能家居 数据分析 开发语言 运维
1.引言学术会议是研究人员获取最新科研成果、发表论文、交流思想的重要平台。对于研究者而言,掌握最新的会议安排、论文提交截止日期、会议议程以及演讲嘉宾等信息至关重要。然而,学术会议信息通常分散在不同的官方网站上,人工查找和整理这些数据既费时又容易遗漏。为了提高效率,我们可以使用Python爬虫自动化获取学术会议数据,包括:会议名称、日期、地点论文提交截止日期会议议程及嘉宾信息论文录用结果重要通知及相
Python条件语句(if-elif-else)的完整用法与嵌套技巧
梦幻南瓜
python python 网络 服务器
引言条件语句是编程中最基础也是最重要的控制结构之一,它使程序能够根据不同条件执行不同的代码路径。Python中的条件语句以if、elif和else关键字实现,语法简洁但功能强大。本文将全面介绍Python条件语句的各种用法,从基础语法到高级嵌套技巧,通过大量代码示例、对比表格和实际应用场景,帮助你掌握条件语句的精髓。1.条件语句基础1.1基本语法结构Python条件语句的基本结构如下:if条件1:
Python特性:装饰器解决数据库长时间断连问题
超龄超能程序猿
数据库 python
前言在基于Python的Web应用开发里,数据库连接是极为关键的一环。不过,像网络波动、数据库服务器维护这类因素,都可能造成数据库长时间断连,进而影响应用的正常运作。本文将详细介绍怎样运用retry_on_failure装饰器来解决数据库长时间断连的难题一问题背景在实际开发场景中,应用和数据库之间的连接可能会由于各种缘由中断(长时间系统无人访问,再次访问,数据库连接超时)。当应用尝试执行数据库操作
Python 字符串前缀详解
Python提供了多种字符串前缀,用于改变字符串的创建方式和行为。下面我将全面汇总并详细解释每种字符串前缀的特性、用途和示例。1.原始字符串(RawString)-r前缀语法:r'...'或r"..."作用:禁用字符串中的转义字符反斜杠\被视为普通字符特别适合处理包含大量反斜杠的字符串适用场景:文件路径(特别是Windows路径)正则表达式需要保留反斜杠的任何情况示例:#普通字符串中的转义path
Python中的条件语句:if-else使用指南
AI软件改变生活
Python 数据库 前端 python
在编程中,条件语句是控制程序流程的核心工具之一,它允许程序根据不同的条件执行不同的代码块。Python提供了简洁而强大的条件语句语法,其中最常用的就是if-else语句。本文将详细介绍Python中if-else的使用方法、常见用法以及一些高级技巧。1.基本语法if-else语句的基本结构如下:Python复制if条件表达式:#如果条件表达式为True,执行这里的代码块passelse:#如果条件
这么简单的从零到一做HTML 网页,你确定不来看看吗?
paid槮
html 服务器 前端
HTML网页的介绍HTML(HypertextMarkupLanguage,超文本标记语言)是一种用于创建网页的标准标记语言,是一种与Python不同的编程语言。网页文件的扩展名通常为,html或.htm,这两种扩展名都可使用,并不会影响文件内容简单的HTML网页框架每一个HTML网页都包含一个基础框架,其他的内容都是在基础框架内进行扩充的。示例代码:这里是标题在这里填入正文这是一个较为基础的HT
Python 2和Python 3的区别?
山禾家的猫
Python社区,有这么个怪问题:“学Python到底是学2还是学3?”这个问题就像月经一样每隔断时间就出现在你面前,也成了很多初学者的选择困惑,这个问题的“始作俑者”当然是Python它爹,大家众说纷纭,有说Python2是主流,大公司都在用,你应该学2。也有说Python3才是未来主流,大多数第三方框架已基本支持Python3。个人看法是Python2还会存在很长一段时间(只要那些用Pytho
Python基础和高级【抽取复习】
斟的是酒中桃
python 学习
1.Python的深拷贝和浅拷贝有什么区别?浅拷贝【ls.copy()】:将列表的不可变对象【值】复制一份,同时引用其中的可变对象【列表】,共用一个内存地址深拷贝【ls=copy.deepcopy(list)】:完全的复制原可变对象,生成新的可变对象,两个对象互相独立2.列表和元组的区别是什么?1.列表概念:有序序列,使用[]定义,元素之间用,隔开有序序列增删改操作:可以增删改列表的任意元素不可变
[Python]Python中if-else的语法,用法示例
LN花开富贵
Python python 学习 笔记 嵌入式 单片机 opencv
Python中多条件判断通过if-elif-else结构实现,elif是elseif的缩写。一、基础语法结构if条件1:#条件1为真时执行的代码块elif条件2:#条件2为真时执行的代码块elif条件3:#条件3为真时执行的代码块else:#所有条件均不满足时执行的代码块顺序判断,当第一个条件满足时其对应的代码块会被执行,后续elif的条件不在检查,如果都是if语句,那么执行完第一个if后后面的i
python源码下载
python源码下载(2010-12-1823:11)不知道python.org一直被堵在墙外…1、http://ftp.python.org/ftp/python/2、http://www.python.org/ftp/python/
Python接地气入门。
欢迎来到"鑫哆哆"编程角世界上最好的语言PYTHON?鑫哆哆跟python的机缘为什么选择python合理的设计学习计划,有助于攻略的成功合理驯服自己脑子合理骗过自己脑子合理安排反馈鑫哆哆的学习python计划基础语法缩进语句规则控制语句规则表达式规则函数规则对象规则类型规则数学运算直接觉醒!鑫哆哆的课程选取迈出第一步恭喜大家成功入门python!总结世界上最好的语言PYTHON?新的一年祝大家心
Python镜像源
染诗
python
https://www.cnblogs.com/songzhixue/p/11296720.html
python设置国内源
twilightdream
python
mkdir.pipcd.piptouchpip.confnanopip.conf贴上[global]trusted-host=mirrors.aliyun.comindex-url=http://mirrors.aliyun.com/pypi/simple
华为OD机考 2025C卷 - 围棋的气 (C++ & Python & JAVA & JS & GO)
无限码力
华为OD机试真题刷题笔记 华为od 华为OD机试2025C卷 华为OD机考2025C卷 华为OD2025C卷
围棋的气华为OD机试真题目录点击查看:华为OD机试2025C卷真题题库目录|机考题库+算法考点详解华为OD机试2025C卷100分题型题目描述围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19x19=361个交点,对弈双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。“气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中,有几个交叉点没有棋子,由此可知:在棋
华为OD机考 2025C卷 - 对称美学 (C++ & Python & JAVA & JS & GO)
无限码力
华为OD机试真题刷题笔记 华为od 华为OD机试2025C卷 华为OD2025C卷 华为OD机考2025C卷
对称美学华为OD机试真题目录点击查看:华为OD机试2025C卷真题题库目录|机考题库+算法考点详解华为OD机试2025C卷100分题型题目描述对称就是最大的美学,现有一道关于对称字符串的美学。已知:第1个字符串:R第2个字符串:BR第3个字符串:RBBR第4个字符串:BRRBRBBR第5个字符串:RBBRBRRBBRRBRBBR相信你已经发现规律了,没错!就是第i个字符串=第i-1号字符串取反+第
华为OD机试 2025 B卷 - We are a Team (C++ & Python & JAVA & JS & GO)
无限码力
华为OD机试真题刷题笔记 华为od 华为OD2025B卷 华为OD机考2025B卷 华为OD机试2025B卷 华为OD机试
WeareaTeam华为OD机试真题目录点击查看:华为OD机试2025B卷真题题库目录|机考题库+算法考点详解华为OD机试2025B卷100分题型题目描述总共有n个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在一个团队中,具体的:消息构成为abc,整数a、b分别代表两个人的标号,整数c代表指令c==0代表a和b在一个团队内c==1
Python中if-else判断语句、while循环语句以及for循环语句的使用总结
bentou_
1.if-esle流程判断语句我们来直接看一个例子,如下,判断我们定义的用户名和用户输入的用户名是否一致。代码当中有几个注意点:判断的时候用双等号表示判断是否一致(三个等号表示赋值)你有没有注意到这里不是用的大括号而是用的冒号!python3对父级和子级的写法是极为严格的,就像这里的if跟else,都是父级,需要顶格写;下面的两个子级(print那里)就需要缩进一个tab。_username="b
Python库安装国内源
奔跑的石头_
python python AI编程
关注公众号“码字读书会”,了解最新消息。Python国内源包括企业和高校机构打不得开源软件包资源。著名的有阿里云、华为云、清华。个人常用的有清华源临时使用命令如下:pipinstall-ittps://pypi.tuna.tsinghua.edu.cn/simple包名
Python从入门到荒废-配置国内下载源
zrhsmile
Python python
为提升Python包安装速度,配置国内下载源是常见需求。以下是主流方法汇总,结合稳定性和易用性推荐:一、pip永久配置国内源(推荐)通过修改配置文件实现“一次配置,长期生效”:创建/修改配置文件Windows:路径:%APPDATA%\pip\pip.ini(如C:\Users\用户名\AppData\Roaming\pip\pip.ini)内容:[global]index-url=https:/
《精雕细琢 Python 对象:深入理解 __slots__ 的性能魔法与实战应用》
《精雕细琢Python对象:深入理解slots的性能魔法与实战应用》引言:探索Python的对象管理机制在Python中,一切皆对象。然而,每一个对象背后都隐藏着复杂的运行机制。尤其在类设计中,我们往往忽略了对象属性的存储方式。今天,我们将深入剖析一个常被高级开发者使用的“利器”——__slots__,它能有效减少内存占用、提升性能,但也伴随着一些权衡和陷阱。本文旨在回答三个核心问题:__slot
LeetCode第337题_打家劫舍III
@蓝莓果粒茶
算法 leetcode 算法 职场和发展 c# 学习
LeetCode第337题:打家劫舍III文章摘要本文详细解析LeetCode第337题"打家劫舍III",这是一道中等难度的二叉树动态规划问题。文章提供了基于深度优先搜索和动态规划的解法,包含C#、Python、C++三种语言实现,配有详细的算法分析和性能对比。适合想要提升二叉树和动态规划能力的程序员。核心知识点:二叉树、动态规划、深度优先搜索难度等级:中等推荐人群:具有基础数据结构知识,想要提
爬虫基础理论总结
qianxun0921
一、什么是爬虫爬虫:又称网页蜘蛛,网络机器人,从互联网上自动抓取数据的程序,通俗地讲,就是可以爬取浏览器中看得到的数据二、爬虫的基本流程1、分析网站,得到目标url2、根据url,发起请求,获取页面的HTML源码3、从页面源码中提取数据:a、提取到目标数据,做数据的筛选和持久化存储b、从页面中提取新的url地址,继续执行第二步操作4、爬虫结束:所有的目标url都提取完毕,并且得到数据了,再也没有其
python:numpy分享(保姆级教程)
苏苏susuus
python numpy 开发语言
目录一、概念二、相关属性三、ndarray及其实例创建(一)ndarray介绍(二)zeros()、ones()、empty()函数(三)**arange(),**类似python的range(),创建一个一维ndarray数组。(四)**matrix()**,是ndarray的子类,只能生成2维的矩阵(五)rand()、randn()、randint()、uniform()(都是numpy.ra
SAX解析xml文件
小猪猪08
xml
1.创建SAXParserFactory实例
2.通过SAXParserFactory对象获取SAXParser实例
3.创建一个类SAXParserHander继续DefaultHandler,并且实例化这个类
4.SAXParser实例的parse来获取文件
public static void main(String[] args) {
//
为什么mysql里的ibdata1文件不断的增长?
brotherlamp
linux linux运维 linux资料 linux视频 linux运维自学
我们在 Percona 支持栏目经常收到关于 MySQL 的 ibdata1 文件的这个问题。
当监控服务器发送一个关于 MySQL 服务器存储的报警时,恐慌就开始了 —— 就是说磁盘快要满了。
一番调查后你意识到大多数地盘空间被 InnoDB 的共享表空间 ibdata1 使用。而你已经启用了 innodbfileper_table,所以问题是:
ibdata1存了什么?
当你启用了 i
Quartz-quartz.properties配置
eksliang
quartz
其实Quartz JAR文件的org.quartz包下就包含了一个quartz.properties属性配置文件并提供了默认设置。如果需要调整默认配置,可以在类路径下建立一个新的quartz.properties,它将自动被Quartz加载并覆盖默认的设置。
下面是这些默认值的解释
#-----集群的配置
org.quartz.scheduler.instanceName =
informatica session的使用
18289753290
workflow session log Informatica
如果希望workflow存储最近20次的log,在session里的Config Object设置,log options做配置,save session log :sessions run ;savesessio log for these runs:20
session下面的source 里面有个tracing 
Scrapy抓取网页时出现CRC check failed 0x471e6e9a != 0x7c07b839L的错误
酷的飞上天空
scrapy
Scrapy版本0.14.4
出现问题现象:
ERROR: Error downloading <GET http://xxxxx CRC check failed
解决方法
1.设置网络请求时的header中的属性'Accept-Encoding': '*;q=0'
明确表示不支持任何形式的压缩格式,避免程序的解压
java Swing小集锦
永夜-极光
java swing
1.关闭窗体弹出确认对话框
1.1 this.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE);
1.2
this.addWindowListener (
new WindowAdapter () {
public void windo
强制删除.svn文件夹
随便小屋
java
在windows上,从别处复制的项目中可能带有.svn文件夹,手动删除太麻烦,并且每个文件夹下都有。所以写了个程序进行删除。因为.svn文件夹在windows上是只读的,所以用File中的delete()和deleteOnExist()方法都不能将其删除,所以只能采用windows命令方式进行删除
GET和POST有什么区别?及为什么网上的多数答案都是错的。
aijuans
get post
如果有人问你,GET和POST,有什么区别?你会如何回答? 我的经历
前几天有人问我这个问题。我说GET是用于获取数据的,POST,一般用于将数据发给服务器之用。
这个答案好像并不是他想要的。于是他继续追问有没有别的区别?我说这就是个名字而已,如果服务器支持,他完全可以把G
谈谈新浪微博背后的那些算法
aoyouzi
谈谈新浪微博背后的那些算法
本文对微博中常见的问题的对应算法进行了简单的介绍,在实际应用中的算法比介绍的要复杂的多。当然,本文覆盖的主题并不全,比如好友推荐、热点跟踪等就没有涉及到。但古人云“窥一斑而见全豹”,希望本文的介绍能帮助大家更好的理解微博这样的社交网络应用。
微博是一个很多人都在用的社交应用。天天刷微博的人每天都会进行着这样几个操作:原创、转发、回复、阅读、关注、@等。其中,前四个是针对短博文,最后的关注和@则针
Connection reset 连接被重置的解决方法
百合不是茶
java 字符流 连接被重置
流是java的核心部分,,昨天在做android服务器连接服务器的时候出了问题,就将代码放到java中执行,结果还是一样连接被重置
被重置的代码如下;
客户端代码;
package 通信软件服务器;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.O
web.xml配置详解之filter
bijian1013
java web.xml filter
一.定义
<filter>
<filter-name>encodingfilter</filter-name>
<filter-class>com.my.app.EncodingFilter</filter-class>
<init-param>
<param-name>encoding<
Heritrix
Bill_chen
多线程 xml 算法 制造 配置管理
作为纯Java语言开发的、功能强大的网络爬虫Heritrix,其功能极其强大,且扩展性良好,深受热爱搜索技术的盆友们的喜爱,但它配置较为复杂,且源码不好理解,最近又使劲看了下,结合自己的学习和理解,跟大家分享Heritrix的点点滴滴。
Heritrix的下载(http://sourceforge.net/projects/archive-crawler/)安装、配置,就不罗嗦了,可以自己找找资
【Zookeeper】FAQ
bit1129
zookeeper
1.脱离IDE,运行简单的Java客户端程序
#ZkClient是简单的Zookeeper~$ java -cp "./:zookeeper-3.4.6.jar:./lib/*" ZKClient
1. Zookeeper是的Watcher回调是同步操作,需要添加异步处理的代码
2. 如果Zookeeper集群跨越多个机房,那么Leader/
The user specified as a definer ('aaa'@'localhost') does not exist
白糖_
localhost
今天遇到一个客户BUG,当前的jdbc连接用户是root,然后部分删除操作都会报下面这个错误:The user specified as a definer ('aaa'@'localhost') does not exist
最后找原因发现删除操作做了触发器,而触发器里面有这样一句
/*!50017 DEFINER = ''aaa@'localhost' */
原来最初
javascript中showModelDialog刷新父页面
bozch
JavaScript 刷新父页面 showModalDialog
在页面中使用showModalDialog打开模式子页面窗口的时候,如果想在子页面中操作父页面中的某个节点,可以通过如下的进行:
window.showModalDialog('url',self,‘status...’); // 首先中间参数使用self
在子页面使用w
编程之美-买书折扣
bylijinnan
编程之美
import java.util.Arrays;
public class BookDiscount {
/**编程之美 买书折扣
书上的贪心算法的分析很有意思,我看了半天看不懂,结果作者说,贪心算法在这个问题上是不适用的。。
下面用动态规划实现。
哈利波特这本书一共有五卷,每卷都是8欧元,如果读者一次购买不同的两卷可扣除5%的折扣,三卷10%,四卷20%,五卷
关于struts2.3.4项目跨站执行脚本以及远程执行漏洞修复概要
chenbowen00
struts WEB安全
因为近期负责的几个银行系统软件,需要交付客户,因此客户专门请了安全公司对系统进行了安全评测,结果发现了诸如跨站执行脚本,远程执行漏洞以及弱口令等问题。
下面记录下本次解决的过程以便后续
1、首先从最简单的开始处理,服务器的弱口令问题,首先根据安全工具提供的测试描述中发现应用服务器中存在一个匿名用户,默认是不需要密码的,经过分析发现服务器使用了FTP协议,
而使用ftp协议默认会产生一个匿名用
[电力与暖气]煤炭燃烧与电力加温
comsci
在宇宙中,用贝塔射线观测地球某个部分,看上去,好像一个个马蜂窝,又像珊瑚礁一样,原来是某个国家的采煤区.....
不过,这个采煤区的煤炭看来是要用完了.....那么依赖将起燃烧并取暖的城市,在极度严寒的季节中...该怎么办呢?
&nbs
oracle O7_DICTIONARY_ACCESSIBILITY参数
daizj
oracle
O7_DICTIONARY_ACCESSIBILITY参数控制对数据字典的访问.设置为true,如果用户被授予了如select any table等any table权限,用户即使不是dba或sysdba用户也可以访问数据字典.在9i及以上版本默认为false,8i及以前版本默认为true.如果设置为true就可能会带来安全上的一些问题.这也就为什么O7_DICTIONARY_ACCESSIBIL
比较全面的MySQL优化参考
dengkane
mysql
本文整理了一些MySQL的通用优化方法,做个简单的总结分享,旨在帮助那些没有专职MySQL DBA的企业做好基本的优化工作,至于具体的SQL优化,大部分通过加适当的索引即可达到效果,更复杂的就需要具体分析了,可以参考本站的一些优化案例或者联系我,下方有我的联系方式。这是上篇。
1、硬件层相关优化
1.1、CPU相关
在服务器的BIOS设置中,可
C语言homework2,有一个逆序打印数字的小算法
dcj3sjt126com
c
#h1#
0、完成课堂例子
1、将一个四位数逆序打印
1234 ==> 4321
实现方法一:
# include <stdio.h>
int main(void)
{
int i = 1234;
int one = i%10;
int two = i / 10 % 10;
int three = i / 100 % 10;
apacheBench对网站进行压力测试
dcj3sjt126com
apachebench
ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求。前段时间看到公司的开发人员也在用它作一些测试,看起来也不错,很简单,也很容易使用,所以今天花一点时间看了一下。
通过下面的一个简单的例子和注释,相信大家可以更容易理解这个工具的使用。
2种办法让HashMap线程安全
flyfoxs
java jdk jni
多线程之--2种办法让HashMap线程安全
多线程之--synchronized 和reentrantlock的优缺点
多线程之--2种JAVA乐观锁的比较( NonfairSync VS. FairSync)
HashMap不是线程安全的,往往在写程序时需要通过一些方法来回避.其实JDK原生的提供了2种方法让HashMap支持线程安全.
Spring Security(04)——认证简介
234390216
Spring Security 认证 过程
认证简介
目录
1.1 认证过程
1.2 Web应用的认证过程
1.2.1 ExceptionTranslationFilter
1.2.2 在request之间共享SecurityContext
1
Java 位运算
Javahuhui
java 位运算
// 左移( << ) 低位补0
// 0000 0000 0000 0000 0000 0000 0000 0110 然后左移2位后,低位补0:
// 0000 0000 0000 0000 0000 0000 0001 1000
System.out.println(6 << 2);// 运行结果是24
// 右移( >> ) 高位补"
mysql免安装版配置
ldzyz007
mysql
1、my-small.ini是为了小型数据库而设计的。不应该把这个模型用于含有一些常用项目的数据库。
2、my-medium.ini是为中等规模的数据库而设计的。如果你正在企业中使用RHEL,可能会比这个操作系统的最小RAM需求(256MB)明显多得多的物理内存。由此可见,如果有那么多RAM内存可以使用,自然可以在同一台机器上运行其它服务。
3、my-large.ini是为专用于一个SQL数据
MFC和ado数据库使用时遇到的问题
你不认识的休道人
sql C++ mfc
===================================================================
第一个
===================================================================
try{
CString sql;
sql.Format("select * from p
表单重复提交Double Submits
rensanning
double
可能发生的场景:
*多次点击提交按钮
*刷新页面
*点击浏览器回退按钮
*直接访问收藏夹中的地址
*重复发送HTTP请求(Ajax)
(1)点击按钮后disable该按钮一会儿,这样能避免急躁的用户频繁点击按钮。
这种方法确实有些粗暴,友好一点的可以把按钮的文字变一下做个提示,比如Bootstrap的做法:
http://getbootstrap.co
Java String 十大常见问题
tomcat_oracle
java 正则表达式
1.字符串比较,使用“==”还是equals()? "=="判断两个引用的是不是同一个内存地址(同一个物理对象)。 equals()判断两个字符串的值是否相等。 除非你想判断两个string引用是否同一个对象,否则应该总是使用equals()方法。 如果你了解字符串的驻留(String Interning)则会更好地理解这个问题。
SpringMVC 登陆拦截器实现登陆控制
xp9802
springMVC
思路,先登陆后,将登陆信息存储在session中,然后通过拦截器,对系统中的页面和资源进行访问拦截,同时对于登陆本身相关的页面和资源不拦截。
实现方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23