文章目录
1. select()方法
1.1 通过标签来提取
1.2 通过类名来查找
1.3 通过ip来查找
1.4 组合提取
1.5 案例
1.5.1 获取所有的tr标签
1.5.2 获取第二个tr标签
1.5.3 获取所有class等于even的tr标签
1.5.4 获取所有a标签的href属性
1.5.5 获取职位信息
2. 修改文档树
2.1 修改tag的名称和属性
2.2 修改string值
2.2 append()添加值
2.3 删除值
3. 爬取天气信息
3.1 思路分析
3.2 实践步骤
3.2.1 初试代码
3.2.2 找寻数据
3.2.3 解决两个问题
3.2.3.1 省会城市名字问题
3.2.3.2 港澳台地区乱码问题
3.2.4 扩展功能
3.3 写入csv文件
4. selenium介绍
1. select()方法
我们也可以通过css选择器来提取数据,但需要我们掌握一些css语法。具体可以参考网页 css选择器参考手册。 示例代码(后面的代码都是在这个代码的基础上继续的):
from bs4 import BeautifulSoup
html_doc = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie ,
Lacie and
Tillie ;
and they lived at the bottom of a well.
...
"""
soup = BeautifulSoup(html_doc,'lxml')
1.1 通过标签来提取
# 提取并打印所有的标签a
print(soup.select('a'))
结果以列表返回所有的标签a,可以通过遍历列表取出所需元素。
[Elsie , Lacie , Tillie ]
1.2 通过类名来查找
比如我们要查找所有类名为"sister"的a标签。
# 提取并打印所有class="sister"的标签
print(soup.select('.sister'))
结果以列表形式返回
[Elsie , Lacie , Tillie ]
1.3 通过ip来查找
# 通过id来提取 #id
print(soup.select('#link1'))
结果
[Elsie ]
1.4 组合提取
我们提取p标签下的所有a标签
# 组合标签提取
print(soup.select('p>a'))
结果以列表返回
[Elsie , Lacie , Tillie ]
# 提取p标签下的id=link1的标签
print(soup.select('p #link1'))
结果
[Elsie ]
选择所有p元素和a元素
# 选取所有p元素和a元素
print(soup.select('p,a'))
结果选出了所有p标签和a标签,以列表返回
[The Dormouse's story
, Once upon a time there were three little sisters; and their names were
Elsie ,
Lacie and
Tillie ;
and they lived at the bottom of a well.
, Elsie , Lacie , Tillie , ...
]
选择所有p元素内的a元素
# 选取所有p元素下的a元素
print(soup.select('p a'))
结果以列表返回
[Elsie , Lacie , Tillie ]
选取所有带有href属性的元素
# 选取所有带有href属性的元素
print(soup.select('[href]'))
结果以列表返回
[Elsie , Lacie , Tillie ]
# 选取所有class = "sister"的元素
print(soup.select('[class=sister]'))
结果以列表返回
[Elsie , Lacie , Tillie ]
# 从属性为title的标签中取出文本
print(soup.select('.title')[0].get_text())
因为print(soup.select(’.title’))返回的是列表,所以这里需要取出列表里面的元素再.get_text()。
The Dormouse's story
1.5 案例
我们把上节课的示例用select()方法操作一下
from bs4 import BeautifulSoup
html = """
"""
soup_2 = BeautifulSoup(html,'lxml')
1.5.1 获取所有的tr标签
# 获取所有的tr标签
print(soup_2.select('tr'))
结果以列表返回
[
职位名称
职位类别
人数
地点
发布时间
,
22989-金融云区块链高级研发工程师(深圳)
技术类
1
深圳
2017-11-25
,
22989-金融云高级后台开发
技术类
2
深圳
2017-11-25
,
SNG16-腾讯音乐运营开发工程师(深圳)
技术类
2
深圳
2017-11-25
,
SNG16-腾讯音乐业务运维工程师(深圳)
技术类
1
深圳
2017-11-25
,
TEG03-高级研发工程师(深圳)
技术类
1
深圳
2017-11-24
,
TEG03-高级图像算法研发工程师(深圳)
技术类
1
深圳
2017-11-24
,
TEG11-高级AI开发工程师(深圳)
技术类
4
深圳
2017-11-24
,
15851-后台开发工程师
技术类
1
深圳
2017-11-24
,
15851-后台开发工程师
技术类
1
深圳
2017-11-24
,
SNG11-高级业务运维工程师(深圳)
技术类
1
深圳
2017-11-24
]
1.5.2 获取第二个tr标签
print(soup_2.select('tr')[1])
结果
22989-金融云区块链高级研发工程师(深圳)
技术类
1
深圳
2017-11-25
1.5.3 获取所有class等于even的tr标签
# 获取所有class等于even的tr标签
trs = soup_2.select('.even')
for tr in trs:
print(tr)
结果
22989-金融云区块链高级研发工程师(深圳)
技术类
1
深圳
2017-11-25
SNG16-腾讯音乐运营开发工程师(深圳)
技术类
2
深圳
2017-11-25
TEG03-高级研发工程师(深圳)
技术类
1
深圳
2017-11-24
TEG11-高级AI开发工程师(深圳)
技术类
4
深圳
2017-11-24
15851-后台开发工程师
技术类
1
深圳
2017-11-24
1.5.4 获取所有a标签的href属性
# 获取所有a标签的href属性
a_lst= soup_2.select('a')
for a in a_lst:
# href = a['href']
href = a.get('href')
print(href)
结果
position_detail.php?id=33824&keywords=python&tid=87&lid=2218
position_detail.php?id=29938&keywords=python&tid=87&lid=2218
position_detail.php?id=31236&keywords=python&tid=87&lid=2218
position_detail.php?id=31235&keywords=python&tid=87&lid=2218
position_detail.php?id=34531&keywords=python&tid=87&lid=2218
position_detail.php?id=34532&keywords=python&tid=87&lid=2218
position_detail.php?id=31648&keywords=python&tid=87&lid=2218
position_detail.php?id=32218&keywords=python&tid=87&lid=2218
position_detail.php?id=32217&keywords=python&tid=87&lid=2218
position_detail.php?id=34511&keywords=python&tid=87&lid=2218
1.5.5 获取职位信息
# 获取职位信息
trs = soup_2.select('tr')[1:] # 因为第一个tr标签内无职位信息,故过滤掉。
for tr in trs:
pos_info = list(tr.stripped_strings) # 由于tr.stripped_strings返回的是一个生成器,所以这里需要转化为列表才能提取其中的元素
print(pos_info[0])
结果
22989-金融云区块链高级研发工程师(深圳)
22989-金融云高级后台开发
SNG16-腾讯音乐运营开发工程师(深圳)
SNG16-腾讯音乐业务运维工程师(深圳)
TEG03-高级研发工程师(深圳)
TEG03-高级图像算法研发工程师(深圳)
TEG11-高级AI开发工程师(深圳)
15851-后台开发工程师
15851-后台开发工程师
SNG11-高级业务运维工程师(深圳)
2. 修改文档树
作为一个了解知识点,一般不主张修改。 示例代码(以下的代码是这个代码的继续):
from bs4 import BeautifulSoup
html_doc = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie ,
Lacie and
Tillie ;
and they lived at the bottom of a well.
...
"""
soup = BeautifulSoup(html_doc,'lxml')
2.1 修改tag的名称和属性
tag_p = soup.p
print(tag_p)
tag_p.name = 'w' # 修改标签名称
print(tag_p)
tag_p['title'] = 'age' # 修改属性值为"title"
print(tag_p)
结果
The Dormouse's story
The Dormouse's story
The Dormouse's story
2.2 修改string值
tag_p = soup.p
print(tag_p.string)
tag_p.string = 'you need python' # 修改string值
print(tag_p.string)
结果对比
The Dormouse's story
you need python
2.2 append()添加值
tag_p = soup.p
print(tag_p)
tag_p.append('abcd') # 添加值
print(tag_p)
结果对比
The Dormouse's story
The Dormouse's story abcd
2.3 删除值
r = soup.find(class_='title')
print(r)
print('-'*100)
r.decompose() # 删除这个标签
print(soup)
结果对比
The Dormouse's story
----------------------------------------------------------------------------------------------------
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie ,
Lacie and
Tillie ;
and they lived at the bottom of a well.
...
通过与示例代码对比发现,虚线上方的那个标签被删除了。
3. 爬取天气信息
我们下面做一个项目,爬取一个网站上的天气信息。 我们的需求是获取全中国城市的名字,以及对应的温度,保存到csv文件中。
3.1 思路分析
我们先以华北地区为例,华北地区共五个城市:北京、天津、河北、内蒙古、石家庄。我们分析一下源码: 如上图,我们找到了每个区域所有的数据都在class = "conMidtab"的一个大标签里,而城市名在table标签下的第三个tr标签里的第一个或第二个td标签里,温度在倒数第二个td标签里。
我们打算定义三个模块,第一个用来解析网页数据,第二个来写入数据,第三个是主函数。
import requests
from bs4 import BeautifulSoup
import csv
def parse_page(url):
pass
def writeData(list):
pass
def main():
pass
if __name__ == '__main__':
main()
3.2 实践步骤
我们来写代码吧。
3.2.1 初试代码
下面我们我们一步一步的写代码:
import requests
from bs4 import BeautifulSoup
import csv
def parse_page(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}
response = requests.get(url,headers = headers)
html = response.content.decode('utf-8')
print(html)
def writeData(list):
pass
def main():
url = 'http://www.weather.com.cn/textFC/hb.shtml'
parse_page(url)
if __name__ == '__main__':
main()
我们可以运行一下程序,看看打印结果:
D:\Python38\python.exe D:/work/爬虫/Day09/weather_2.py
省/直辖市
城市
周三(1月20日)白天
周三(1月20日)夜间
天气现象
风向风力
最高气温
天气现象
风向风力
最低气温
结果是正确的,我们可以把这个结果复制下来,重新定义一个html,令其等于这个结果,以后每次测试就不用再次打扰该网站的服务器了,推荐这样做,道德爬网。等所有的代码检测没有问题了,我们再向服务器发起请求。
3.2.2 找寻数据
html = '''... ...'''
soup = BeautifulSoup(html,'lxml')
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
print(table)
print('*-'*60)
结果我们发现有五个省份的数据,继续提取出五个省份城市的名字:
html = '''... ...'''
soup = BeautifulSoup(html,'lxml')
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
trs = table.find_all('tr')[2:]
for tr in trs:
tds = tr.find_all('td')
city_td = tds[0]
city = city_td.strings
print(city)
结果就是这样的 是一个生成器。 需要转化成列表
# html = '''... ...'''
soup = BeautifulSoup(html,'lxml')
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
trs = table.find_all('tr')[2:]
for tr in trs:
tds = tr.find_all('td')
city_td = tds[0]
city = list(city_td.strings)
print(city)
这一次结果出来了:
['\n', '北京', '\n']
['\n', '海淀']
['\n', '朝阳']
['\n', '顺义']
... ...
发现里面有不必要的字符,可以去除一下。而且我们发现结果是列表,我们需要提取其中的城市名字,于是:
html = '''... ...'''
soup = BeautifulSoup(html,'lxml')
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
trs = table.find_all('tr')[2:] # 过滤掉前两个tr标签,里面是表头内容
for tr in trs:
tds = tr.find_all('td')
city_td = tds[0]
city = list(city_td.stripped_strings)[0]
print(city)
结果:
北京
海淀
朝阳
顺义
怀柔
...
出现了我们想要的结果。 下面我们补充上温度的数据就可以了,发现温度在倒数第二个td标签里面。于是:
html = '''... ...'''
soup = BeautifulSoup(html,'lxml')
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
trs = table.find_all('tr')[2:]
for tr in trs:
tds = tr.find_all('td')
city_td = tds[0]
temp_td = tds[-2]
city = list(city_td.stripped_strings)[0]
temp = list(temp_td.stripped_strings)[0]
print('city',city,'temp',temp)
结果出来了:
city 北京 temp -6
city 海淀 temp -6
city 朝阳 temp -5
city 顺义 temp -7
city 怀柔 temp -9
city 通州 temp -8
... ...
3.2.3 解决两个问题
下面这两个问题让我们学会到:
一个新的函数:enumerate()
一个容错率比较高的解析器:html5lib
当然还有一个换源安装方法
3.2.3.1 省会城市名字问题
本来以为万事大吉了,没想到在测试其他区域时出现了新的问题。比如,在测试华东地区的时候,第一个城市的名字不是“哈尔滨”,而是“黑龙江”。后来检查网页的源代码发现,第一个td里显示的是省份的名字,第二个td里显示的才是该省份的省会城市。而北京是直辖市,两个td里显示的相同。不仅北京,上海,天津,所有的直辖市都是如此。但如果碰到不是直辖市的省份就出错了。怎么解决这个问题呢?如果我们只取第二个td标签里的城市可以吗?不可以,因为,其他的城市第二个标签是天气状况,是阴天和是晴天这样的信息。只有每个table里第一个tr标签里的第二个td是省会城市名。如果我们全都提取第二个td标签的内容,那么其他的城市的名字都显示成天气状况了。这样怎么办呢?既然只有第一个tr标签的第二个td是省会城市名,那么我们只需要当index(tr)==0的时候(即每个省份的第一个tr标签)取第二个td标签里的信息就可以了。于是我们只需要加一个判断就可以了,这里我们需要一个新的函数来帮助,enumerate()函数,它返回两个值,第一个返回值是列表里的元素的索引值,第二个返回值是元素本身。用法举例:
w_lst = ['a','b','c','d','e']
for index,i in enumerate(w_lst):
print(index,i)
输出的结果:
0 a
1 b
2 c
3 d
4 e
所以我们把url地址换成东北地区的,我们的代码就可以改变成这样的了:
url = 'http://www.weather.com.cn/textFC/db.shtml'
def parse_page(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}
response = requests.get(url,headers = headers)
html = response.content.decode('utf-8')
soup = BeautifulSoup(html,'lxml')
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
trs = table.find_all('tr')[2:] # 过滤掉前两个tr标签,里面是表头内容
for index,tr in enumerate(trs): # 使用enumerate()函数来判断tr标签的索引值
tds = tr.find_all('td')
city_td = tds[0]
if index == 0: # 当tr的索引值为0时,即第一个tr标签时,
city_td =tds[1] # 城市名取第二个td标签里的内容。
temp_td = tds[-2]
city = list(city_td.stripped_strings)[0]
temp = list(temp_td.stripped_strings)[0]
print('city',city,'temp',temp)
parse_page(url)
结果:
city 哈尔滨 temp -18
city 齐齐哈尔 temp -21
city 牡丹江 temp -25
city 佳木斯 temp -22
city 绥化 temp -20
... ...
第一个城市名字就是哈尔滨了。
3.2.3.2 港澳台地区乱码问题
本以为这次应该没有问题了,可是当我们把url换成港澳台地区的时候结果是这样子地:
city 香港 temp 16
city 省/直辖市 temp 周三(1月20日)夜间
city 天气现象 temp 风向风力
city 澳门 temp 15
city 省/直辖市 temp 周三(1月20日)夜间
city 天气现象 temp 风向风力
city 台湾 temp 17
city 高雄 temp 19
city 台中 temp 12
city 省/直辖市 temp 周四(1月21日)夜间
city 天气现象 temp 风向风力
city 香港 temp 17
信息是错乱的,完全驴头对不住马嘴。这是什么原因呢?经过分析网页源代码发现,代码的标签不完整,也就是说源代码有错误。而浏览器的解析会自动补充这些标签代码的缺失,所以渲染出来仍然没有问题。是不是程序员偷懒了,给我们造成了麻烦。不过不要紧,我们有另一个解析器大家还记得吗?html5lib,他老人家就是按照浏览器的解析方式来解析代码的。缺点是慢,但优点是容错率贼高。所以我们试试吧?不过要先安装html5lib解析器才能使用哦。我安装的时候发现直接用pip install html5lib贼慢,而且失败了。于是用了一次从没有用过的方式,传说中的换源安装。简单介绍:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple html5lib
这里我用的是清华的源,你也可以用其他的,格式就是这么个格式。发现瞬间安装成功了。 然后我们的代码就把解析器换成这个就行了,其他的都不用改。
soup = BeautifulSoup(html,'html5lib') # 只需要改这一句就可以了。
于是乎,我们的问题解决了。
soup = BeautifulSoup(html,'html5lib')
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
trs = table.find_all('tr')[2:]
for index,tr in enumerate(trs): # 使用enumerate()函数来判断tr标签的索引值
tds = tr.find_all('td')
city_td = tds[0]
if index == 0: # 当tr的索引值为0时,即第一个tr标签时,
city_td =tds[1] # 城市名取第二个td标签里的内容。
temp_td = tds[-2]
city = list(city_td.stripped_strings)[0]
temp = list(temp_td.stripped_strings)[0]
print('city',city,'temp',temp)
结果
city 香港 temp 16
city 澳门 temp 15
city 台北 temp 17
city 高雄 temp 19
city 台中 temp 12
很规矩的数据。
3.2.4 扩展功能
在这里我们需要将代码扩展一下,使得能够适用于爬取所有地区的数据。这里可以把所有的url制作成一个列表,然后用循环的方式提取url就可以了。扩展后的完整代码是这样子的:
import requests
from bs4 import BeautifulSoup
import csv
url = 'http://www.weather.com.cn/textFC/gat.shtml'
def parse_page(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}
response = requests.get(url,headers = headers)
html = response.content.decode('utf-8')
soup = BeautifulSoup(html,'html5lib')
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
for table in tables:
trs = table.find_all('tr')[2:] # 过滤掉前两个tr标签,里面是表头内容
for index,tr in enumerate(trs): # 使用enumerate()函数来判断tr标签的索引值
tds = tr.find_all('td')
city_td = tds[0]
if index == 0: # 当tr的索引值为0时,即每个省(每个table是一个省)的第一个tr标签时,
city_td =tds[1] # 城市名取第二个td标签里的内容。
temp_td = tds[-2]
city = list(city_td.stripped_strings)[0]
temp = list(temp_td.stripped_strings)[0]
print('city',city,'temp',temp)
def main():
url_head = 'http://www.weather.com.cn/textFC/{}.shtml'
end_lst = ['hb','db','hd','hz','hn','xb','xn','gat']
for i in end_lst:
url = url_head.format(i)
parse_page(url)
print('*()*_'*20)
if __name__ == '__main__':
main()
运行后结果:
... ...
city 巴彦淖尔 temp -12
city 锡林郭勒 temp -17
city 呼伦贝尔 temp -23
city 兴安盟 temp -20
city 阿拉善盟 temp -7
*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_
city 哈尔滨 temp -18
city 齐齐哈尔 temp -21
city 牡丹江 temp -25
city 佳木斯 temp -22
city 绥化 temp -20
city 黑河 temp -26
... ...
结果太长了,我就复制这么多。
3.3 写入csv文件
我们仍然采用字典的方式写入,代码如下:
import requests
from bs4 import BeautifulSoup
import csv
url = 'http://www.weather.com.cn/textFC/gat.shtml'
def parse_page(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}
response = requests.get(url,headers = headers)
html = response.content.decode('utf-8')
soup = BeautifulSoup(html,'html5lib')
conMidtab = soup.find('div',class_='conMidtab')
tables = conMidtab.find_all('table')
info_list = [] # 先定义一个空列表用来盛装要写入的数据
for table in tables:
trs = table.find_all('tr')[2:]
for index,tr in enumerate(trs): # 使用enumerate()函数来判断tr标签的索引值
info_Dict = {} # 先定义一个空字典,后面把对应城市和天气信息作为键值对添加
tds = tr.find_all('td')
city_td = tds[0]
if index == 0: # 当tr的索引值为0时,即第一个tr标签时,
city_td =tds[1] # 城市名取第二个td标签里的内容。
temp_td = tds[-2]
info_Dict['city'] = list(city_td.stripped_strings)[0]
info_Dict['temp'] = list(temp_td.stripped_strings)[0]
info_list.append(info_Dict)
return info_list
def writeData(inf_list):
with open('China_weather.csv','w',encoding='utf-8',newline='') as f:
writer = csv.DictWriter(f,fieldnames=['city','temp'])
writer.writeheader()
writer.writerows(inf_list)
def main():
lst = []
url_head = 'http://www.weather.com.cn/textFC/{}.shtml'
end_lst = ['hb','db','hd','hz','hn','xb','xn','gat']
for i in end_lst:
url = url_head.format(i)
lst += parse_page(url)
writeData(lst)
print('正在写入'+i+'地区的信息')
if __name__ == '__main__':
main()
运行结果:
正在写入hb地区的信息
正在写入db地区的信息
正在写入hd地区的信息
正在写入hz地区的信息
正在写入hn地区的信息
正在写入xb地区的信息
正在写入xn地区的信息
正在写入gat地区的信息
在我的对应文件夹里多出来了一个csv文件 在我的文件管理器里打开是这样子地: 这个项目到此就完成了。
4. selenium介绍
selenium本身是一款网站自动化测试的工具,并非为爬虫开发。但被借用来为爬虫解决一些问题。比如,一些数据是用ajax加载的,从网页的url里请求不到,所以,就可以用selenium工具模仿人工操作。好处是,所见即所得。坏处就是速度太慢,而且容易被识别。因为现在很多网站,如某宝,都能识别出这个工具,就用不了了。它常常和chromedriver一起使用。selenium+chromedriver chromedriver是一款浏览器驱动程序,可以驱动chrome浏览器。当然,不同的浏览器有不同的驱动器。
Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
Firefox:https://github.com/mozilla/geckodriver/releases
Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
下载chromedriver
百度搜索:淘宝镜像(https://npm.taobao.org/)
安装总结:https://www.jianshu.com/p/a383e8970135
安装Selenium:pip install selenium 要求安装的驱动要和安装的浏览器对应。 下节课我们再继续讲selenium的应用。
你可能感兴趣的:(爬虫)
Python爬虫解析工具之xpath使用详解
eqa11
python 爬虫 开发语言
文章目录Python爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门
nosql数据库技术与应用知识点
皆过客,揽星河
NoSQL nosql 数据库 大数据 数据分析 数据结构 非关系型数据库
Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)
Java爬虫框架(一)--架构设计
狼图腾-狼之传说
java 框架 java 任务 html解析器 存储 电子商务
一、架构图那里搜网络爬虫框架主要针对电子商务网站进行数据爬取,分析,存储,索引。爬虫:爬虫负责爬取,解析,处理电子商务网站的网页的内容数据库:存储商品信息索引:商品的全文搜索索引Task队列:需要爬取的网页列表Visited表:已经爬取过的网页列表爬虫监控平台:web平台可以启动,停止爬虫,管理爬虫,task队列,visited表。二、爬虫1.流程1)Scheduler启动爬虫器,TaskMast
Java:爬虫框架
dingcho
Java java 爬虫
一、ApacheNutch2【参考地址】Nutch是一个开源Java实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。Nutch致力于让每个人能很容易,同时花费很少就可以配置世界一流的Web搜索引擎.为了完成这一宏伟的目标,Nutch必须能够做到:每个月取几十亿网页为这些网页维护一个索引对索引文件进行每秒上千次的搜索提供高质量的搜索结果简单来说Nutch支持分
WebMagic:强大的Java爬虫框架解析与实战
Aaron_945
Java java 爬虫 开发语言
文章目录引言官网链接WebMagic原理概述基础使用1.添加依赖2.编写PageProcessor高级使用1.自定义Pipeline2.分布式抓取优点结论引言在大数据时代,网络爬虫作为数据收集的重要工具,扮演着不可或缺的角色。Java作为一门广泛使用的编程语言,在爬虫开发领域也有其独特的优势。WebMagic是一个开源的Java爬虫框架,它提供了简单灵活的API,支持多线程、分布式抓取,以及丰富的
00. 这里整理了最全的爬虫框架(Java + Python)
有一只柴犬
爬虫系列 爬虫 java python
目录1、前言2、什么是网络爬虫3、常见的爬虫框架3.1、java框架3.1.1、WebMagic3.1.2、Jsoup3.1.3、HttpClient3.1.4、Crawler4j3.1.5、HtmlUnit3.1.6、Selenium3.2、Python框架3.2.1、Scrapy3.2.2、BeautifulSoup+Requests3.2.3、Selenium3.2.4、PyQuery3.2
python爬取微信小程序数据,python爬取小程序数据
2301_81900439
前端
大家好,小编来为大家解答以下问题,python爬取微信小程序数据,python爬取小程序数据,现在让我们一起来看看吧!Python爬虫系列之微信小程序实战基于Scrapy爬虫框架实现对微信小程序数据的爬取首先,你得需要安装抓包工具,这里推荐使用Charles,至于怎么使用后期有时间我会出一个事例最重要的步骤之一就是分析接口,理清楚每一个接口功能,然后连接起来形成接口串思路,再通过Spider的回调
大模型训练数据库Common Crawl
WindyChanChan
数据集 语言模型 数据库
CommonCrawl介绍CommonCrawl是一个非营利组织,致力于通过大规模分布式爬虫系统定期抓取整个Web并将其存储在一个可公开访问的数据库中。CommonCrawl的数据收集和处理过程包括使用Python开源爬虫工具收集全球范围内的网站数据,并将其上传到CommonCrawl基金会的数据仓库中。该项目从2008年开始,至今已经积累了大量的原始网页数据、元数据和文本提取数据。这些数据
Python精选200Tips:121-125
AnFany
Python200+Tips python 开发语言
Spendyourtimeonself-improvement121Requests-简化的HTTP请求处理发送GET请求发送POST请求发送PUT请求发送DELETE请求会话管理处理超时文件上传122BeautifulSoup-网页解析和抓取解析HTML和XML文档查找单个标签查找多个标签使用CSS选择器查找标签提取文本修改文档内容删除标签处理XML文档123Scrapy-强大的网络爬虫框架示例
爬虫技术抓取网站数据被限制怎么处理
Bearjumpingcandy
爬虫
爬虫技术用于抓取网站数据时,可能会遇到一些限制,常见的包括反爬机制、速率限制、IP封禁等。以下是应对这些情况的一些策略:尊重robots.txt:每个网站都有robots.txt文件,遵循其中的规定可以避免触犯网站的抓取规则。设置合理频率:控制爬虫请求的速度,通过添加延迟或使用代理服务器,减少对目标网站的压力。使用代理:获取并使用代理IP地址可以更换访问来源,降低被识别的可能性。模拟用户行为:使用
网站推广爬虫
Bearjumpingcandy
爬虫
网站推广爬虫是一种用于升网站曝光度和推广效果的工具。它通过自动化地访问和收集网站信息,从而实现对目标网站的广告、关键词、排名等数据进行分析和优化。以下是网站推广爬虫的一些介绍:数据收集:网站推广爬虫可以自动访问目标网站,并收集相关的数据,如网站流量、关键词排名、竞争对手信息等。这些数据可以帮助网站推广人员了解网站的现状和竞争环境,从而制定相应的推广策略。关键词优化:通过分析搜索引擎的关键词排名情况
爬虫技术抓取网站数据
Bearjumpingcandy
爬虫
爬虫技术是一种自动化获取网站数据的技术,它可以模拟人类浏览器的行为,访问网页并提取所需的信息。以下是爬虫技术抓取网站数据的一般步骤:发起HTTP请求:爬虫首先会发送HTTP请求到目标网站,获取网页的内容。解析HTML:获取到网页内容后,爬虫会使用HTML解析器解析HTML代码,提取出需要的数据。数据提取:通过使用XPath、CSS选择器或正则表达式等工具,爬虫可以从HTML中提取出所需的数据,如文
爬虫技术抓取网站数据
Bearjumpingcandy
爬虫
爬虫技术是指通过程序自动访问网页并提取数据的技术。一般来说,爬虫技术包含以下几个步骤:确定目标网站:确定需要抓取的网站,并了解其页面结构和数据特点。分析页面结构:分析网页的结构和源代码,找到需要抓取的数据在页面中的位置和标识。编写爬虫程序:使用编程语言(如Python)编写爬虫程序,实现对目标网站的自动访问和数据提取。处理抓取数据:对抓取到的数据进行清洗、去重、整合等处理,以便后续的分析和利用。爬
爬虫之隧道代理:如何在爬虫中使用代理IP?
2401_87251497
python 开发语言 爬虫 网络 tcp/ip 网络协议
在进行网络爬虫时,使用代理IP是一种常见的方式来绕过网站的反爬虫机制,提高爬取效率和数据质量。本文将详细介绍如何在爬虫中使用隧道代理,包括其原理、优势以及具体的实现方法。无论您是爬虫新手还是有经验的开发者,这篇文章都将为您提供实用的指导。什么是隧道代理?隧道代理是一种高级的代理技术,它通过创建一个加密的隧道,将数据从客户端传输到代理服务器,再由代理服务器转发到目标服务器。这样不仅可以隐藏客户端的真
分享一个基于python的电子书数据采集与可视化分析 hadoop电子书数据分析与推荐系统 spark大数据毕设项目(源码、调试、LW、开题、PPT)
计算机源码社
Python项目 大数据 大数据 python hadoop 计算机毕业设计选题 计算机毕业设计源码 数据分析 spark毕设
作者:计算机源码社个人简介:本人八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流!学习资料、程序开发、技术解答、文档报告如需要源码,可以扫取文章下方二维码联系咨询Java项目微信小程序项目Android项目Python项目PHP项目ASP.NET项目Node.js项目选题推荐项目实战|p
python抓取网页内容401应该用哪个库_python3使用requests模块爬取页面内容入门
坂田月半
python的爬虫相关模块有很多,除了requests模块,再如urllib和pycurl以及tornado等。相比而言,requests模块是相对简单易上手的。通过文本,大家可以迅速学会使用python的requests模块爬取页码内容。1.Requests唯一的一个非转基因的PythonHTTP库,人类可以安全享用。官网:http://cn.python-requests.org/zh_CN/
【Python爬虫】百度百科词条内容
PokiFighting
数据处理 python 爬虫 开发语言
词条内容我这里随便选取了一个链接,用的是FBI的词条importurllib.requestimporturllib.parsefromlxmlimportetreedefquery(url):headers={'user-agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/80.
爬虫和代理IP的关系
xiaoxiongip666
爬虫 tcp/ip 服务器
爬虫和代理IP之间的关系是相互依存的。代理IP为爬虫提供了绕过IP限制、隐藏真实IP、提高访问速度等能力,使得爬虫能够更有效地进行数据抓取。然而,在使用时也需要注意合法性、稳定性、成本以及隐私保护等问题。
python语言爬虫爬取歌曲程序代码
EYYLTV
python 爬虫 android
importrequestssong_urls=[“http://music.163.com/song/media/outer/url?id=25795016.mp3”,“https://m703.music.126.net/20240915140140/670dfe5c0144991d4cb778d6662fd762/jd-musicrep-privatecloud-audio-public/o
python语言爬虫爬取歌曲代码X
EYYLTV
python 爬虫 java
importrequestssong_urls=[“https://m804.music.126.net/20240915142147/4e01caa69abda60b165e185607805ee1/jdyyaac/obj/w5rDlsOJwrLDjj7CmsOj/30379084686/b56a/dbd5/39fc/792d87f5d7014bb78547ec3804eeaac5.m4a?au
拼多多商家电话采集工具 爬虫教程分享
小电商达人
爬虫
以下是使用Python编写的拼多多商家电话采集爬虫教程:一、前期准备安装Python:从Python官方网站下载并安装最新版本的Python,安装过程中注意勾选将Python添加到系统路径选项。安装相关库:在命令提示符中运行以下命令来安装所需的库。pipinstallrequests:用于发送HTTP请求获取网页内容。pipinstallbeautifulsoup4:用于解析HTML页面。二、分析
Python爬虫代理池
极客李华
python授课 python 爬虫 开发语言
Python爬虫代理池网络爬虫在数据采集和信息抓取方面起到了关键作用。然而,为了应对网站的反爬虫机制和保护爬虫的真实身份,使用代理池变得至关重要。1.代理池的基本概念:代理池是一组包含多个代理IP地址的集合。通过在爬虫中使用代理池,我们能够隐藏爬虫的真实IP地址,实现一定程度的匿名性。这有助于防止被目标网站封锁或限制访问频率。2.为何使用代理池:匿名性:代理池允许爬虫在请求目标网站时使用不同的IP
大数据毕业设计hadoop+spark+hive知识图谱租房数据分析可视化大屏 租房推荐系统 58同城租房爬虫 房源推荐系统 房价预测系统 计算机毕业设计 机器学习 深度学习 人工智能
2401_84572577
程序员 大数据 hadoop 人工智能
做了那么多年开发,自学了很多门编程语言,我很明白学习资源对于学一门新语言的重要性,这些年也收藏了不少的Python干货,对我来说这些东西确实已经用不到了,但对于准备自学Python的人来说,或许它就是一个宝藏,可以给你省去很多的时间和精力。别在网上瞎学了,我最近也做了一些资源的更新,只要你是我的粉丝,这期福利你都可拿走。我先来介绍一下这些东西怎么用,文末抱走。(1)Python所有方向的学习路线(
10个高效的Python爬虫框架,你用过几个?
进击的C语言
python
小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapyscrapy官网:https://scrapy.org/scrapy中文文档:https://www.osgeo.cn/scrapy/intro/oScrapy是一个为了爬取网站数据,提取结构性数据而编写的
python爬虫(5)之CSDN
It is a deal️
小项目 python json 爬虫
CSDN的爬虫相对于doubatop250更加简单,一般只需要title和url即可下面是相关的代码:#爬虫之csdn#分析urlhttps://www.csdn.net/api/articles?type=more&category=python&shown_offset=0(firstpage)#https://www.csdn.net/api/articles?type=more&categ
python学习第七节:正则表达式
一只会敲代码的小灰灰
python学习 python 学习 正则表达式
python学习第七节:正则表达式正则表达式基本上在所有开发语言中都会使用到,在python中尤为重要。当我们使用python开发爬虫程序将目标网页扒下来之后我们要从网页中解析出我们想要的信息,这个时候就需要正则表达式去进行匹配。importrere的常量re模块中有9个常量,常量的值都是int类型!(知道就行)修饰符描述re.l使匹配对大小写不敏感re.L做本地化识别(locale-aware)
分布式框架Celery七(Django-Celery-Flower实现异步和定时爬虫及其监控邮件告警)
yjjpp2301
Celery 分布式 django python 后端
Django中集成方式安装模块pipinstallDjango==3.2.22pipinstallcelerypipinstallredispipinstalleventlet#在windows环境下需要安装eventlet包-----------pipinstalldjango-celery-beatpipinstalldjango-celery-resultspipinstalldjango-
生产者消费者模式_Labview基础之生产者消费者设计模式(事件)
weixin_39532699
生产者消费者模式
1绪论近期,开了一个QQ群,刚开始的目的也是想多拉写软件相关的大神,有问题的时候也可以交流交流。记得当时有个软件在写的时候遇到了一个棘手的问题,outlook邮箱配置账户密码的问题,到现在也没解决,算了,也不是很迫切。2000人群就留在那里爬虫发单吧!建群以后才发现,原来这一块的小白还挺多,总结起来就一个原因:做这个软件的大多数都不是软件出生,都是因为临时要搭建一个上位机平台,匆匆入门......
Python——爬虫
星和月
python
当编写一个Python爬虫时,你可以使用BeautifulSoup库来解析网页内容,使用requests库来获取网页的HTML代码。下面是一个简单的示例,演示了如何获取并解析网页内容:importrequestsfrombs4importBeautifulSoup#发送HTTP请求获取网页内容url='https://www.example.com'#要爬取的网页的URLresponse=requ
Python数据分析之股票信息可视化实现matplotlib
Blogfish
Python3 大数据 python 可视化 数据分析
今天学习爬虫技术数据分析对于股票信息的分析及结果呈现,目标是实现对股票信息的爬取并对数据整理后,生成近期成交量折线图。首先,做这个案例一定要有一个明确的思路。知道要干啥,知道用哪些知识,有些方法我也记不住百度下知识库很强大,肯定有答案。有思路以后准备对数据处理,就是几个方法使用了。接口地址参考:Tushare数据涉及知识库:tushare-一个财经数据开放接口;pandas-实现将数据整理为表格,
apache 安装linux windows
墙头上一根草
apache inux windows
linux安装Apache 有两种方式一种是手动安装通过二进制的文件进行安装,另外一种就是通过yum 安装,此中安装方式,需要物理机联网。以下分别介绍两种的安装方式
通过二进制文件安装Apache需要的软件有apr,apr-util,pcre
1,安装 apr 下载地址:htt
fill_parent、wrap_content和match_parent的区别
Cb123456
match_parent fill_parent
fill_parent、wrap_content和match_parent的区别:
1)fill_parent
设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间。这跟Windows控件的dockstyle属性大体一致。设置一个顶部布局或控件为fill_parent将强制性让它布满整个屏幕。
2) wrap_conte
网页自适应设计
天子之骄
html css 响应式设计 页面自适应
网页自适应设计
网页对浏览器窗口的自适应支持变得越来越重要了。自适应响应设计更是异常火爆。再加上移动端的崛起,更是如日中天。以前为了适应不同屏幕分布率和浏览器窗口的扩大和缩小,需要设计几套css样式,用js脚本判断窗口大小,选择加载。结构臃肿,加载负担较大。现笔者经过一定时间的学习,有所心得,故分享于此,加强交流,共同进步。同时希望对大家有所
[sql server] 分组取最大最小常用sql
一炮送你回车库
SQL Server
--分组取最大最小常用sql--测试环境if OBJECT_ID('tb') is not null drop table tb;gocreate table tb( col1 int, col2 int, Fcount int)insert into tbselect 11,20,1 union allselect 11,22,1 union allselect 1
ImageIO写图片输出到硬盘
3213213333332132
java image
package awt;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imagei
自己的String动态数组
宝剑锋梅花香
java 动态数组 数组
数组还是好说,学过一两门编程语言的就知道,需要注意的是数组声明时需要把大小给它定下来,比如声明一个字符串类型的数组:String str[]=new String[10]; 但是问题就来了,每次都是大小确定的数组,我需要数组大小不固定随时变化怎么办呢? 动态数组就这样应运而生,龙哥给我们讲的是自己用代码写动态数组,并非用的ArrayList 看看字符
pinyin4j工具类
darkranger
.net
pinyin4j工具类Java工具类 2010-04-24 00:47:00 阅读69 评论0 字号:大中小
引入pinyin4j-2.5.0.jar包:
pinyin4j是一个功能强悍的汉语拼音工具包,主要是从汉语获取各种格式和需求的拼音,功能强悍,下面看看如何使用pinyin4j。
本人以前用AscII编码提取工具,效果不理想,现在用pinyin4j简单实现了一个。功能还不是很完美,
StarUML学习笔记----基本概念
aijuans
UML建模
介绍StarUML的基本概念,这些都是有效运用StarUML?所需要的。包括对模型、视图、图、项目、单元、方法、框架、模型块及其差异以及UML轮廓。
模型、视与图(Model, View and Diagram)
&
Activiti最终总结
avords
Activiti id 工作流
1、流程定义ID:ProcessDefinitionId,当定义一个流程就会产生。
2、流程实例ID:ProcessInstanceId,当开始一个具体的流程时就会产生,也就是不同的流程实例ID可能有相同的流程定义ID。
3、TaskId,每一个userTask都会有一个Id这个是存在于流程实例上的。
4、TaskDefinitionKey和(ActivityImpl activityId
从省市区多重级联想到的,react和jquery的差别
bee1314
jquery UI react
在我们的前端项目里经常会用到级联的select,比如省市区这样。通常这种级联大多是动态的。比如先加载了省,点击省加载市,点击市加载区。然后数据通常ajax返回。如果没有数据则说明到了叶子节点。 针对这种场景,如果我们使用jquery来实现,要考虑很多的问题,数据部分,以及大量的dom操作。比如这个页面上显示了某个区,这时候我切换省,要把市重新初始化数据,然后区域的部分要从页面
Eclipse快捷键大全
bijian1013
java eclipse 快捷键
Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加)Ctrl+Alt+↑ 复制当前行到上一行(复制增加)Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt+↑ 当前行和上面一行交互位置(同上)Alt+← 前一个编辑的页面Alt+→ 下一个编辑的页面(当然是针对上面那条来说了)Alt+En
js 笔记 函数
征客丶
JavaScript
一、函数的使用
1.1、定义函数变量
var vName = funcation(params){
}
1.2、函数的调用
函数变量的调用: vName(params);
函数定义时自发调用:(function(params){})(params);
1.3、函数中变量赋值
var a = 'a';
var ff
【Scala四】分析Spark源代码总结的Scala语法二
bit1129
scala
1. Some操作
在下面的代码中,使用了Some操作:if (self.partitioner == Some(partitioner)),那么Some(partitioner)表示什么含义?首先partitioner是方法combineByKey传入的变量,
Some的文档说明:
/** Class `Some[A]` represents existin
java 匿名内部类
BlueSkator
java匿名内部类
组合优先于继承
Java的匿名类,就是提供了一个快捷方便的手段,令继承关系可以方便地变成组合关系
继承只有一个时候才能用,当你要求子类的实例可以替代父类实例的位置时才可以用继承。
在Java中内部类主要分为成员内部类、局部内部类、匿名内部类、静态内部类。
内部类不是很好理解,但说白了其实也就是一个类中还包含着另外一个类如同一个人是由大脑、肢体、器官等身体结果组成,而内部类相
盗版win装在MAC有害发热,苹果的东西不值得买,win应该不用
ljy325
游戏 apple windows XP OS
Mac mini 型号: MC270CH-A RMB:5,688
Apple 对windows的产品支持不好,有以下问题:
1.装完了xp,发现机身很热虽然没有运行任何程序!貌似显卡跑游戏发热一样,按照那样的发热量,那部机子损耗很大,使用寿命受到严重的影响!
2.反观安装了Mac os的展示机,发热量很小,运行了1天温度也没有那么高
&nbs
读《研磨设计模式》-代码笔记-生成器模式-Builder
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/**
* 生成器模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示(GoF)
* 个人理解:
* 构建一个复杂的对象,对于创建者(Builder)来说,一是要有数据来源(rawData),二是要返回构
JIRA与SVN插件安装
chenyu19891124
SVN jira
JIRA安装好后提交代码并要显示在JIRA上,这得需要用SVN的插件才能看见开发人员提交的代码。
1.下载svn与jira插件安装包,解压后在安装包(atlassian-jira-subversion-plugin-0.10.1)
2.解压出来的包里下的lib文件夹下的jar拷贝到(C:\Program Files\Atlassian\JIRA 4.3.4\atlassian-jira\WEB
常用数学思想方法
comsci
工作
对于搞工程和技术的朋友来讲,在工作中常常遇到一些实际问题,而采用常规的思维方式无法很好的解决这些问题,那么这个时候我们就需要用数学语言和数学工具,而使用数学工具的前提却是用数学思想的方法来描述问题。。下面转帖几种常用的数学思想方法,仅供学习和参考
函数思想
把某一数学问题用函数表示出来,并且利用函数探究这个问题的一般规律。这是最基本、最常用的数学方法
pl/sql集合类型
daizj
oracle 集合 type pl/sql
--集合类型
/*
单行单列的数据,使用标量变量
单行多列数据,使用记录
单列多行数据,使用集合(。。。)
*集合:类似于数组也就是。pl/sql集合类型包括索引表(pl/sql table)、嵌套表(Nested Table)、变长数组(VARRAY)等
*/
/*
--集合方法
&n
[Ofbiz]ofbiz初用
dinguangx
电商 ofbiz
从github下载最新的ofbiz(截止2015-7-13),从源码进行ofbiz的试用
1. 加载测试库
ofbiz内置derby,通过下面的命令初始化测试库
./ant load-demo (与load-seed有一些区别)
2. 启动内置tomcat
./ant start
或
./startofbiz.sh
或
java -jar ofbiz.jar
&
结构体中最后一个元素是长度为0的数组
dcj3sjt126com
c gcc
在Linux源代码中,有很多的结构体最后都定义了一个元素个数为0个的数组,如/usr/include/linux/if_pppox.h中有这样一个结构体: struct pppoe_tag { __u16 tag_type; __u16 tag_len; &n
Linux cp 实现强行覆盖
dcj3sjt126com
linux
发现在Fedora 10 /ubutun 里面用cp -fr src dest,即使加了-f也是不能强行覆盖的,这时怎么回事的呢?一两个文件还好说,就输几个yes吧,但是要是n多文件怎么办,那还不输死人呢?下面提供三种解决办法。 方法一
我们输入alias命令,看看系统给cp起了一个什么别名。
[root@localhost ~]# aliasalias cp=’cp -i’a
Memcached(一)、HelloWorld
frank1234
memcached
一、简介
高性能的架构离不开缓存,分布式缓存中的佼佼者当属memcached,它通过客户端将不同的key hash到不同的memcached服务器中,而获取的时候也到相同的服务器中获取,由于不需要做集群同步,也就省去了集群间同步的开销和延迟,所以它相对于ehcache等缓存来说能更好的支持分布式应用,具有更强的横向伸缩能力。
二、客户端
选择一个memcached客户端,我这里用的是memc
Search in Rotated Sorted Array II
hcx2013
search
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given ta
Spring4新特性——更好的Java泛型操作API
jinnianshilongnian
spring4 generic type
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
CentOS安装JDK
liuxingguome
centos
1、行卸载原来的:
[root@localhost opt]# rpm -qa | grep java
tzdata-java-2014g-1.el6.noarch
java-1.7.0-openjdk-1.7.0.65-2.5.1.2.el6_5.x86_64
java-1.6.0-openjdk-1.6.0.0-11.1.13.4.el6.x86_64
[root@localhost
二分搜索专题2-在有序二维数组中搜索一个元素
OpenMind
二维数组 算法 二分搜索
1,设二维数组p的每行每列都按照下标递增的顺序递增。
用数学语言描述如下:p满足
(1),对任意的x1,x2,y,如果x1<x2,则p(x1,y)<p(x2,y);
(2),对任意的x,y1,y2, 如果y1<y2,则p(x,y1)<p(x,y2);
2,问题:
给定满足1的数组p和一个整数k,求是否存在x0,y0使得p(x0,y0)=k?
3,算法分析:
(
java 随机数 Math与Random
SaraWon
java Math Random
今天需要在程序中产生随机数,知道有两种方法可以使用,但是使用Math和Random的区别还不是特别清楚,看到一篇文章是关于的,觉得写的还挺不错的,原文地址是
http://www.oschina.net/question/157182_45274?sort=default&p=1#answers
产生1到10之间的随机数的两种实现方式:
//Math
Math.roun
oracle创建表空间
tugn
oracle
create temporary tablespace TXSJ_TEMP
tempfile 'E:\Oracle\oradata\TXSJ_TEMP.dbf'
size 32m
autoextend on
next 32m maxsize 2048m
extent m
使用Java8实现自己的个性化搜索引擎
yangshangchuan
java superword 搜索引擎 java8 全文检索
需要对249本软件著作实现句子级别全文检索,这些著作均为PDF文件,不使用现有的框架如lucene,自己实现的方法如下:
1、从PDF文件中提取文本,这里的重点是如何最大可能地还原文本。提取之后的文本,一个句子一行保存为文本文件。
2、将所有文本文件合并为一个单一的文本文件,这样,每一个句子就有一个唯一行号。
3、对每一行文本进行分词,建立倒排表,倒排表的格式为:词=包含该词的总行数N=行号