Python爬虫——新闻热点爬取
显示更多
可以看到相关的数据接口,里面有新闻标题以及新闻详情的url地址
如何提取url地址
1、转成json,键值对取值;
2、用正则表达式匹配url地址;
根据接口数据链接中的pager 变化进行翻页,其对应的就是页码。
详情页可以看到新闻内容都是在 div标签里面 p 标签内,按照正常的解析网站即可获取新闻内容。
保存方式
txt文本形式 PDF形式
整体爬取思路总结
在栏目列表页中,点击更多新闻内容,获取接口数据url
接口数据url中返回的数据内容中匹配新闻详情页url
使用常规解析网站操作(re、css、xpath)提取新闻内容
保存数据
import parsel
import requests
import re
#### 获取网页源代码
def get_html ( html_url) :
"" "
获取网页源代码 response
: param html_url: 网页url地址
: return : 网页源代码
"" "
headers = {
"User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36" ,
"Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" , }
response = requests. get ( url= html_url, headers= headers)
return response
#### 获取每篇新闻url地址
def get_page_url ( html_data) :
"" "
获取每篇新闻url地址
: param html_data: response. text
: return : 每篇新闻的url地址
"" "
page_url_list = re. findall ( '"url":"(.*?)"' , html_data)
return page_url_list
#### 文件保存命名不能含有特殊字符,需要对新闻标题进行处理
def file_name ( name) :
"" "
文件命名不能携带 特殊字符
: param name: 新闻标题
: return : 无特殊字符的标题
"" "
replace = re. compile ( r'[\\\/\:\*\?\"\<\>\|]' )
new_name = re. sub ( replace, '_' , name)
return new_name
####保存数据
def download ( content, title) :
"" "
with open 保存新闻内容 txt
: param content: 新闻内容
: param title: 新闻标题
: return :
"" "
path = '新闻\\' + title + '.txt'
with open ( path, mode= 'a' , encoding= 'utf-8' ) as f:
f. write ( content)
print ( '正在保存' , title)
### 主函数
def main ( url) :
"" "
主函数
: param url: 新闻列表页 url地址
: return :
"" "
html_data = get_html ( url) . text # 获得接口数据response. text
lis = get_page_url ( html_data) # 获得新闻url地址列表
for li in lis:
page_data = get_html ( li) . content. decode ( 'utf-8' , 'ignore' ) # 新闻详情页 response. text
selector = parsel. Selector ( page_data)
title = re. findall ( '(.*?) ' , page_data, re. S) [ 0 ] # 获取新闻标题
new_title = file_name ( title)
new_data = selector. css ( '#cont_1_1_2 div.left_zw p::text' ) . getall ( )
content = '' . join ( new_data)
download ( content, new_title)
if __name__ == '__main__' :
for page in range ( 1 , 101 ) :
url_1 = 'https://channel.chinanews.com/cns/cjs/gj.shtml?pager={}&pagenum=9&t=5_58' . format ( page)
main ( url_1)
在浏览器开发者模式network下很快能找到一个‘?category=new_hot…’字样的文件,查看该文件发现新闻内容的数据全部存储在data里面,且能发现数据类型为json;
只要找到这个文件的requests url即可通过python requests来爬取网页了;
查看请求的url, 发现链接为:https://www.toutiao.com/api/pc/feed/?category=news_hot&utm_source=toutiao&widen=1&max_behot_time=0&max_behot_time_tmp=0&tadrequire=true&as=A1B5AC16548E0FA&cp=5C647E601F9AEE1&_signature=F09fYAAASzBjiSc9oUU9MxdPX3 其中max_behot_time在获取的json数据中获得 :
在网上找了下大神对as和cp算法的分析, 发现两个参数在js文件:home_4abea46.js中有,具体算法如下代码:
! function ( t) {
var e = { } ;
e. getHoney = function ( ) {
var t = Math. floor ( ( new Date ) . getTime ( ) / 1e3 )
, e = t. toString ( 16 ) . toUpperCase ( )
, i = md5 ( t) . toString ( ) . toUpperCase ( ) ;
if ( 8 != e. length)
return {
as: "479BB4B7254C150" ,
cp: "7E0AC8874BB0985"
} ;
for ( var n = i. slice ( 0 , 5 ) , a = i. slice ( - 5 ) , s = "" , o = 0 ; 5 > o; o++ )
s + = n[ o] + e[ o] ;
for ( var r = "" , c = 0 ; 5 > c; c++ )
r + = e[ c + 3 ] + a[ c] ;
return {
as: "A1" + s + e. slice ( - 3 ) ,
cp: e. slice ( 0 , 3 ) + r + "E1"
}
}
,
t. ascp = e
} ( window, document) ,
python获取as和cp值的代码如下:(代码参考blog:https://www.cnblogs.com/xuchunlin/p/7097391.html)
def get_as_cp ( ) : # 该函数主要是为了获取as和cp参数,程序参考今日头条中的加密js文件:home_4abea46. js
zz = { }
now = round ( time. time ( ) )
print ( now) # 获取当前计算机时间
e = hex ( int ( now) ) . upper ( ) [ 2 : ] #hex ( ) 转换一个整数对象为16 进制的字符串表示
print ( 'e:' , e)
a = hashlib. md5 ( ) #hashlib. md5 ( ) . hexdigest ( ) 创建hash对象并返回16 进制结果
print ( 'a:' , a)
a. update ( str ( int ( now) ) . encode ( 'utf-8' ) )
i = a. hexdigest ( ) . upper ( )
print ( 'i:' , i)
if len ( e) != 8 :
zz = { 'as' : '479BB4B7254C150' ,
'cp' : '7E0AC8874BB0985' }
return zz
n = i[ : 5 ]
a = i[ - 5 : ]
r = ''
s = ''
for i in range ( 5 ) :
s= s+ n[ i] + e[ i]
for j in range ( 5 ) :
r = r+ e[ j+ 3 ] + a[ j]
zz = {
'as' : 'A1' + s+ e[ - 3 : ] ,
'cp' : e[ 0 : 3 ] + r+ 'E1'
}
print ( 'zz:' , zz)
return zz
这样完整的链接就构成了,另外提一点就是:
_signature参数去掉也是可以获取到json数据的,
import requests
import json
from openpyxl import Workbook
import time
import hashlib
import os
import datetime
start_url = 'https://www.toutiao.com/api/pc/feed/?category=news_hot&utm_source=toutiao&widen=1&max_behot_time='
url = 'https://www.toutiao.com'
headers= {
'user-agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
cookies = { 'tt_webid' : '6649949084894053895' } # 此处cookies可从浏览器中查找,为了避免被头条禁止爬虫
max_behot_time = '0' # 链接参数
title = [ ] # 存储新闻标题
source_url = [ ] # 存储新闻的链接
s_url = [ ] # 存储新闻的完整链接
source = [ ] # 存储发布新闻的公众号
media_url = { } # 存储公众号的完整链接
def get_as_cp ( ) : # 该函数主要是为了获取as和cp参数,程序参考今日头条中的加密js文件:home_4abea46. js
zz = { }
now = round ( time. time ( ) )
print ( now) # 获取当前计算机时间
e = hex ( int ( now) ) . upper ( ) [ 2 : ] #hex ( ) 转换一个整数对象为16 进制的字符串表示
print ( 'e:' , e)
a = hashlib. md5 ( ) #hashlib. md5 ( ) . hexdigest ( ) 创建hash对象并返回16 进制结果
print ( 'a:' , a)
a. update ( str ( int ( now) ) . encode ( 'utf-8' ) )
i = a. hexdigest ( ) . upper ( )
print ( 'i:' , i)
if len ( e) != 8 :
zz = { 'as' : '479BB4B7254C150' ,
'cp' : '7E0AC8874BB0985' }
return zz
n = i[ : 5 ]
a = i[ - 5 : ]
r = ''
s = ''
for i in range ( 5 ) :
s= s+ n[ i] + e[ i]
for j in range ( 5 ) :
r = r+ e[ j+ 3 ] + a[ j]
zz = {
'as' : 'A1' + s+ e[ - 3 : ] ,
'cp' : e[ 0 : 3 ] + r+ 'E1'
}
print ( 'zz:' , zz)
return zz
def getdata ( url, headers, cookies) : # 解析网页函数
r = requests. get ( url, headers= headers, cookies= cookies)
print ( url)
data = json. loads ( r. text)
return data
def savedata ( title, s_url, source, media_url) : # 存储数据到文件
# 存储数据到xlxs文件
wb = Workbook ( )
if not os. path. isdir ( os. getcwd ( ) + '/result' ) : # 判断文件夹是否存在
os. makedirs ( os. getcwd ( ) + '/result' ) # 新建存储文件夹
filename = os. getcwd ( ) + '/result/result-' + datetime. datetime. now ( ) . strftime ( '%Y-%m-%d-%H-%m' ) + '.xlsx' # 新建存储结果的excel文件
ws = wb. active
ws. title = 'data' # 更改工作表的标题
ws[ 'A1' ] = '标题' # 对表格加入标题
ws[ 'B1' ] = '新闻链接'
ws[ 'C1' ] = '头条号'
ws[ 'D1' ] = '头条号链接'
for row in range ( 2 , len ( title) + 2 ) : # 将数据写入表格
_= ws. cell ( column= 1 , row= row, value= title[ row- 2 ] )
_= ws. cell ( column= 2 , row= row, value= s_url[ row- 2 ] )
_= ws. cell ( column= 3 , row= row, value= source[ row- 2 ] )
_= ws. cell ( column= 4 , row= row, value= media_url[ source[ row- 2 ] ] )
wb. save ( filename= filename) # 保存文件
def main ( max_behot_time, title, source_url, s_url, source, media_url) : # 主函数
for i in range ( 3 ) : # 此处的数字类似于你刷新新闻的次数,正常情况下刷新一次会出现10 条新闻,但夜存在少于10 条的情况;所以最后的结果并不一定是10 的倍数
ascp = get_as_cp ( ) # 获取as和cp参数的函数
demo = getdata ( start_url+ max_behot_time+ '&max_behot_time_tmp=' + max_behot_time+ '&tadrequire=true&as=' + ascp[ 'as' ] + '&cp=' + ascp[ 'cp' ] , headers, cookies)
print ( demo)
# time. sleep ( 1 )
for j in range ( len ( demo[ 'data' ] ) ) :
# print ( demo[ 'data' ] [ j] [ 'title' ] )
if demo[ 'data' ] [ j] [ 'title' ] not in title:
title. append ( demo[ 'data' ] [ j] [ 'title' ] ) # 获取新闻标题
source_url. append ( demo[ 'data' ] [ j] [ 'source_url' ] ) # 获取新闻链接
source. append ( demo[ 'data' ] [ j] [ 'source' ] ) # 获取发布新闻的公众号
if demo[ 'data' ] [ j] [ 'source' ] not in media_url:
media_url[ demo[ 'data' ] [ j] [ 'source' ] ] = url+ demo[ 'data' ] [ j] [ 'media_url' ] # 获取公众号链接
print ( max_behot_time)
max_behot_time = str ( demo[ 'next' ] [ 'max_behot_time' ] ) # 获取下一个链接的max_behot_time参数的值
for index in range ( len ( title) ) :
print ( '标题:' , title[ index] )
if 'https' not in source_url[ index] :
s_url. append ( url+ source_url[ index] )
print ( '新闻链接:' , url+ source_url[ index] )
else :
print ( '新闻链接:' , source_url[ index] )
s_url. append ( source_url[ index] )
# print ( '源链接:' , url+ source_url[ index] )
print ( '头条号:' , source[ index] )
print ( len ( title) ) # 获取的新闻数量
if __name__ == '__main__' :
main ( max_behot_time, title, source_url, s_url, source, media_url)
savedata ( title, s_url, source, media_url)
Python爬虫——使用Python爬取代理数据
结构的分析以及网页数据的提取
/2 首页分析及提取/
简单分析下页面, 其中后面的 1 是页码的意思,分析后发现每一页有100 多条数据, 然后网站底部总共有 2700+页 的链接, 所以总共ip 代理加起来超过 27 万条数据, 但是后面的数据大部分都是很多年前的数据了,比如 2012 年, 大概就前 5000 多条是最近一个月的,所以决定爬取前面100 页。 通 过网站 url 分析,可以知道这 100 页的 url 为:
规律显而易见,在程序中,我们使用一个 for 循环即可完整这个操作: 其中 scrapy 函数是爬取的主要逻辑,对应的代码为: 通过这个方式,我们可以得到每一页的数据
/3 网页元素分析及提取/
接下来就是对页面内的元素进行分析,提取其中的代理信息。
如上图,我们目的是进行代理地域分布分析, 同时,在爬取过程中需要使用爬取的数据进行代 理更新, 所以需要以下几个字段的信息:
Ip 地址、端口、服务器位置、类型
为此,先构建一个类,用于保存这些信息:
这样,每爬取一条信息,只要实例化一个 ProxyBean 类即可,非常方便。
接下来就是提取元素过程了,
在这个过程我使用了正则表达式和 BeautifulSoup 库进行关键数据提取。
首先,通过分析网页发现,所有的条目实际上都是放在一个标签中。
该便签内容如下:
< table id= "ip_list" > ……< / table>
我们首先通过正则表达式将该标签的内容提取出来:
正则表达式为:,
表示搜索之 间的任意字符组成的数据。
Python 中的实现如下:
其中得到的 data 就是这个标签的内容了。下面进一步分析。
进入到 table 中,发现每一个代理分别站 table 的一列,
但是这些 标签分为两类,一 类包含属性 class="odd", 另一类不包含
通过这种方式,就能获取到每一个列的列表了。
接下来就是从每个列中获取 ip、端口、位置、类型等信息了。进一步分析页面:
我们使用正则表达式对 IP 进行解析,IP 正则如下:
** (2[0-5]{2}|[0-1]?\d{1,2})(.(2[0-5]{2}|[0-1]?\d{1,2})){3}**
2、 端口字段 端口由包裹,并且中间全部是数字,故可构造如下正则进行提取:
([0-9]+)
3、 位置字段
位置字段如下:
由 便签包裹,构造如下正则即可提取:
< a href= "( [ ^ > ] * ) > ( [ ^ < ] * ) < / a>
4、类型字段
类型字段如下:
由包裹,中间为字母,构造正则如下:
< td> ( [ A - Za- z] + ) < / td>
数据全部获取完之后,将其保存到文件中即可:
/4 小结/
本次任务主要爬取了代理网站上的代理数据。主要做了以下方面的工作:
学习 requests 库的使用以及爬虫程序的编写; 学习使用反爬虫技术手段,并在实际应用中应用这些技术,如代理池技术; 学习使用正则表达式,并通过正则表达式进行网页元素提取; 学习使用 beautifulsoup 库,并使用该库进行网页元素的提取。
IP代理池
import urllib. request
import urllib
import requests
import re
import time
import random
proxys = [ ]
def show_interface ( ) :
choice= input ( "请选择功能:1.显示可用代理;2.显示可用代理并生成文本;3.退出系统:" )
return choice
def get_proxyIP ( ) :
ip_title= [ ] #IP列表
try:
page_num= input ( '想要爬取多少个代理IP页面(注:每个页面包含100个IP地址,输入数值大于等于2,小于等于705):' )
if int ( page_num) < 2 or int ( page_num) > 705 :
print ( ">>>>>已经说明清楚了,再乱输的是傻逼 o -_-)=○)°O°) 给你一拳!" )
return ip_title
else :
for i in range ( 1 , int ( page_num) ) :
url= 'http://www.xicidaili.com/nt/' + str ( i)
headers= { "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64)" }
request= urllib. request. Request ( url= url, headers= headers)
response= urllib. request. urlopen ( request)
content= response. read ( ) . decode ( 'utf-8' )
pattern= re. compile ( ' (\d.*?|HTTP|HTTPS) ')
ip_page= re. findall ( pattern, str ( content) )
ip_title. extend ( ip_page)
time. sleep ( random. choice ( range ( 1 , 3 ) ) )
print ( '代理IP地址 ' , '\t' , '端口' , '\t' , '类型' , '\t\t\t' , '存活时间' , '\t\t' , '验证时间' )
for i in range ( 0 , len ( ip_title) , 5 ) :
if len ( ip_title[ i] ) < 14 and len ( ip_title[ i] ) > 10 :
print ( ip_title[ i] , ' ' , '\t' , ip_title[ i+ 1 ] , '\t' , ip_title[ i+ 2 ] , '\t\t\t' , ip_title[ i+ 3 ] , '\t\t' , ip_title[ i+ 4 ] )
elif len ( ip_title[ i] ) <= 10 :
print ( ip_title[ i] , ' ' , '\t' , ip_title[ i + 1 ] , '\t' , ip_title[ i + 2 ] , '\t\t\t' , ip_title[ i + 3 ] , '\t\t' , ip_title[ i+ 4 ] )
else :
print ( ip_title[ i] , ' ' , '\t' , ip_title[ i+ 1 ] , '\t' , ip_title[ i+ 2 ] , '\t\t\t' , ip_title[ i+ 3 ] , '\t\t' , ip_title[ i+ 4 ] )
return ip_title
except ValueError:
print ( ">>>>>已经说明清楚了,再乱输的是傻逼 o -_-)=○)°O°) 给你一拳!" )
return ip_title
proxy_ip= open ( 'proxy_ip.txt' , 'w' ) #新建文档存储有效IP
def effective_IP ( ip_title) :
socket. setdefaulttimeout ( 5 ) #设置全局超时时间
url= 'https://www.cnblogs.com/sjzh/p/5990152.html'
try:
for i in range ( 0 , len ( ip_title) , 5 ) :
ip= { ip_title[ i+ 2 ] : ip_title[ i] + ":" + ip_title[ i+ 1 ] }
proxy_support= urllib. request. ProxyHandler ( ip)
opener= urllib. request. build_opener ( proxy_support)
opener. addheaders= [ ( 'User-Agent' , 'Mozilla/5.0 (Windows NT 10.0; WOW64)' ) ]
urllib. request. install_opener ( opener)
res= urllib. request. urlopen ( url) . read ( )
print ( ip_title[ i] + ':' + ip_title[ i+ 1 ] , 'is OK' )
proxy_ip. write ( '%s\n' % str ( '\'' + ip_title[ i+ 2 ] + '\'' + ':' + '\'' + ip_title[ i] + ':' + ip_title[ i+ 1 ] + '\'' ) ) #写入IP
print ( '总共爬取了' + str ( len ( ip_title) / 5 ) + '个有效IP' )
except Exception as e:
print ( i, e)
if __name__== '__main__' :
print ( ' ' )
print ( ' ' )
print ( ' ◆◆ ◆◆◆◆◆ ◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ' )
print ( ' ◆◆ ◆◆ ◆◆◆ ◆ ◆◆ ◆ ◆ ◆◆◆◆ ◆◆◆◆◆◆◆ ' )
print ( ' ◆◆ ◆ ◆◆ ◆ ◆ ◆ ◆ ◆◆◆ ◆◆◆◆◆◆◆◆ ' )
print ( ' ◆◆◆ ◆ ◆◆◆ ◆ ◆◆◆◆◆◆◆◆◆ ◆◆ ◆◆ ◆◆◆◆ ' )
print ( ' ◆◆◆◆◆◆◆◆◆◆◆◆◆◆ ◆ ◆ ◆ ◆ ◆◆ ◆◆ ◆◆◆ ' )
print ( ' ◆◆◆ ◆◆ ◆ ◆ ◆ ◆ ◆◆ ◆◆ ◆◆◆◆ ' )
print ( ' ◆◆◆ ◆◆ ◆◆◆◆◆◆◆ ◆ ◆◆ ◆◆ ◆◆◆◆◆◆◆ ' )
print ( ' ◆ ◆ ◆◆ ◆ ◆◆◆◆◆◆◆◆◆ ◆◆ ◆◆◆◆◆◆ ' )
print ( ' ◆ ◆◆ ◆ ◆ ◆◆ ◆◆ ' )
print ( ' ◆ ◆◆ ◆ ◆ ◆◆ ◆◆ ' )
print ( ' ◆ ◆◆ ◆ ◆ ◆◆◆◆◆◆◆◆◆ ◆◆ ◆◆ ' )
print ( ' ◆ ◆◆◆ ◆◆ ◆◆◆ ◆ ◆◆◆◆◆ ◆◆◆◆◆◆ ' )
print ( ' ◆ ◆◆ ◆◆ ◆◆◆◆ ◆ ' )
print ( ' ◆ ◆◆◆◆ ◆◆◆◆ ◆◆◆◆◆◆◆◆◆◆◆ ' )
print ( ' ◆ ◆◆ ' )
print ( '' )
print ( '' )
choice = show_interface ( )
while True:
if choice== '1' :
get_proxyIP ( )
i= input ( ">>>>>还想继续使用该系统?(Y/N):" )
if i== 'Y' or i== 'y' :
choice= show_interface ( )
else :
print ( '>>>>>欢迎再次使用*_*,我也要睡觉觉了(-_-)ZZZ' )
break
if choice== '2' :
ip_title= get_proxyIP ( )
effective_IP ( ip_title)
i = input ( ">>>>>还想继续使用该系统?(Y/N):" )
if i == 'Y' or i == 'y' :
choice = show_interface ( )
else :
print ( '>>>>>欢迎再次使用*_*,我也要睡觉觉了(-_-)ZZZ' )
break
if choice== '3' :
print ( '>>>>>欢迎再次使用*_*,我也要睡觉觉了(-_-)ZZZ' )
break
import requests
import parsel
import time
def check_ip ( proxies_list) :
"" "检测ip的方法" ""
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36' }
can_use = [ ]
for proxy in proxies_list:
try:
response = requests. get ( 'http://www.baidu.com' , headers= headers, proxies= proxy, timeout= 0.1 ) # 超时报错
if response. status_code == 200 :
can_use. append ( proxy)
except Exception as error:
print ( error)
return can_use
import requests
import parsel
# 1 、确定爬取的url路径,headers参数
base_url = 'https://www.kuaidaili.com/free/'
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36' }
# 2 、发送请求 -- requests 模拟浏览器发送请求,获取响应数据
response = requests. get ( base_url, headers= headers)
data = response. text
# print ( data)
# 3 、解析数据 -- parsel 转化为Selector对象,Selector对象具有xpath的方法,能够对转化的数据进行处理
# 3 、1 转换python可交互的数据类型
html_data = parsel. Selector ( data)
# 3 、2 解析数据
parse_list = html_data. xpath ( '//table[@class="table table-bordered table-striped"]/tbody/tr' ) # 返回Selector对象
# print ( parse_list)
# 免费 IP { "协议" : "IP:port" }
# 循环遍历,二次提取
proxies_list = [ ]
for tr in parse_list:
proxies_dict = { }
http_type = tr. xpath ( './td[4]/text()' ) . extract_first ( )
ip_num = tr. xpath ( './td[1]/text()' ) . extract_first ( )
port_num = tr. xpath ( './td[2]/text()' ) . extract_first ( )
# print ( http_type, ip_num, port_num)
# 构建代理ip字典
proxies_dict[ http_type] = ip_num + ':' + port_num
# print ( proxies_dict)
proxies_list. append ( proxies_dict)
print ( proxies_list)
print ( "获取到的代理ip数量:" , len ( proxies_list) , '个' )
# 检测代理ip可用性
can_use = check_ip ( proxies_list)
print ( "能用的代理:" , can_use)
print ( "能用的代理数量:" , len ( can_use) )
环境搭建
打开 安装
找到 可执行文件路径 (便于配置虚拟环境)
linux 环境配置
安装系统依赖包 sudo apt-get install libssl1.0.0 libssl-dev tcl tk sqlite sqlite3 libbz2-1.0 libbz2-dev libexpat1 libexpat1-dev libgdbm3 libgdbm-dev libreadline5 libreadline6 libreadline-dev libreadline6-dev libsqlite0 libsqlite0-dev libsqlite3-0 libsqlite3-dev openssl
上面的依赖包是ubuntu的安装源的包名,不同版本的linux包名可能不一样
下载源码包并解压
wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz
tar -xzvf Python-3.6.8.tgz -C /tmp
cd /tmp/Python-3.6.8/
把Python3.6安装到 /usr/local 目录
./configure --prefix=/usr/local
make
make altinstall
上面操作执行完成以后就可以执行:
python3.6 就可以进入python的交互环境了
注:
很多linux操作系统会默认安装python和python3,大家可以在终端中输入python或者python3就能查看是否默认安装了py2和py3的版本,如果没有安装可以使用
ln -s /usr/local/bin/python3.6 /usr/bin/python
或者 ln -s /usr/local/bin/python3.6 /usr/bin/python3
生成python或者python3直接运行的python3.6的软连接 安装pip
python3对应的pip很多linux操作系统没有默认安装, 可以通过
sudo apt-get install python3-pip
安装python3的pip 安装完成以后可以终端中输入: pip3 查看是否安装成功
后续的所有的关于pip中安装的命令,这里都使用 pip3 install XXX
#虚拟环境搭建#
不同项目 不同依赖包
python 版本不一样
所以需要 隔离的 py环境
我们使用 virtualenvwrapper (包装的env)
win 可以直接使用
linux mac 配置
sudo apt-get install python3.6
centos
再安装pip
virtualenv
pip install virtualenv
python爬虫——入门(1)
pymysql orm 保存数据
html解析方法 分析
抓取 静态网页 论坛
动态网站 电商类
模拟登陆cookie 社区类
验证突破
反爬虫突破
多线程 线程池
scrapy
通用分布式爬虫框架模块
更新迭代采集
通用解析方法
分布存储
#认识爬虫#
搜索引擎 之前 输入域名访问
搜索引擎 主动查询代替 被动浏览
怎么获取所有数据(我们关心的内容)
产生爬虫 爬取 索引
采集网络数据
自动化测试 (接口 请求 验证数据)selenium
脱离手动 (抢票 , 微信助手,爱聊,注册账号,登陆,获取资料)
灰产业 (撸羊毛,网络水军,攻击)
数据产品 数据聚合(新闻 ,头条)
搜索产品
数据分析、人工智能元数据
特定领域 数据服务(二手车估价,天气预报,团购,去哪儿)
#知识储备#
计算机网络 (http/https协议,tcp/ip协议,socket编程)
前端基础
正则表达式(数据处理)xpath css选择器
数据分布式存储
并发处理,多线程池,协程
图像识别(处理反扒,验证码)
机器学习算法(验证码,数据解析)
#学习问题#
大型爬虫 采集更新策略
解决 数据反爬虫 机制(多变)
数据解析
数据存储
模拟登陆(验证码识别)
爬虫监控 部署
数据去重
#爬虫正能量#
注意节制 限速/代理/线程 控制 减少频率
数据安全 robots.txt协议
法律问题 (2019.11.30 并不成熟)
可显数据
反扒策略
#robots协议#
你可能感兴趣的:(python,爬虫,开发语言)
理解Gunicorn:Python WSGI服务器的基石
范范0825
ipython linux 运维
理解Gunicorn:PythonWSGI服务器的基石介绍Gunicorn,全称GreenUnicorn,是一个为PythonWSGI(WebServerGatewayInterface)应用设计的高效、轻量级HTTP服务器。作为PythonWeb应用部署的常用工具,Gunicorn以其高性能和易用性著称。本文将介绍Gunicorn的基本概念、安装和配置,帮助初学者快速上手。1.什么是Gunico
Python数据分析与可视化实战指南
William数据分析
python python 数据
在数据驱动的时代,Python因其简洁的语法、强大的库生态系统以及活跃的社区,成为了数据分析与可视化的首选语言。本文将通过一个详细的案例,带领大家学习如何使用Python进行数据分析,并通过可视化来直观呈现分析结果。一、环境准备1.1安装必要库在开始数据分析和可视化之前,我们需要安装一些常用的库。主要包括pandas、numpy、matplotlib和seaborn等。这些库分别用于数据处理、数学
python os.environ
江湖偌大
python 深度学习
os.environ['TF_CPP_MIN_LOG_LEVEL']='0'#默认值,输出所有信息os.environ['TF_CPP_MIN_LOG_LEVEL']='1'#屏蔽通知信息(INFO)os.environ['TF_CPP_MIN_LOG_LEVEL']='2'#屏蔽通知信息和警告信息(INFO\WARNING)os.environ['TF_CPP_MIN_LOG_LEVEL']='
Python中os.environ基本介绍及使用方法
鹤冲天Pro
# Python python 服务器 开发语言
文章目录python中os.environos.environ简介os.environ进行环境变量的增删改查python中os.environ的使用详解1.简介2.key字段详解2.1常见key字段3.os.environ.get()用法4.环境变量的增删改查和判断是否存在4.1新增环境变量4.2更新环境变量4.3获取环境变量4.4删除环境变量4.5判断环境变量是否存在python中os.envi
Pyecharts数据可视化大屏:打造沉浸式数据分析体验
我的运维人生
信息可视化 数据分析 数据挖掘 运维开发 技术共享
Pyecharts数据可视化大屏:打造沉浸式数据分析体验在当今这个数据驱动的时代,如何将海量数据以直观、生动的方式展现出来,成为了数据分析师和企业决策者关注的焦点。Pyecharts,作为一款基于Python的开源数据可视化库,凭借其丰富的图表类型、灵活的配置选项以及高度的定制化能力,成为了构建数据可视化大屏的理想选择。本文将深入探讨如何利用Pyecharts打造数据可视化大屏,并通过实际代码案例
Python教程:一文了解使用Python处理XPath
旦莫
Python进阶 python 开发语言
目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代
python os.environ_python os.environ 读取和设置环境变量
weixin_39605414
python os.environ
>>>importos>>>os.environ.keys()['LC_NUMERIC','GOPATH','GOROOT','GOBIN','LESSOPEN','SSH_CLIENT','LOGNAME','USER','HOME','LC_PAPER','PATH','DISPLAY','LANG','TERM','SHELL','J2REDIR','LC_MONETARY','QT_QPA
使用Faiss进行高效相似度搜索
llzwxh888
faiss python
在现代AI应用中,快速和高效的相似度搜索是至关重要的。Faiss(FacebookAISimilaritySearch)是一个专门用于快速相似度搜索和聚类的库,特别适用于高维向量。本文将介绍如何使用Faiss来进行相似度搜索,并结合Python代码演示其基本用法。什么是Faiss?Faiss是一个由FacebookAIResearch团队开发的开源库,主要用于高维向量的相似性搜索和聚类。Faiss
python是什么意思中文-在python中%是什么意思
编程大乐趣
Python中%有两种:1、数值运算:%代表取模,返回除法的余数。如:>>>7%212、%操作符(字符串格式化,stringformatting),说明如下:%[(name)][flags][width].[precision]typecode(name)为命名flags可以有+,-,''或0。+表示右对齐。-表示左对齐。''为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0表示使用0填
Day1笔记-Python简介&标识符和关键字&输入输出
~在杰难逃~
Python python 开发语言 大数据 数据分析 数据挖掘
大家好,从今天开始呢,杰哥开展一个新的专栏,当然,数据分析部分也会不定时更新的,这个新的专栏主要是讲解一些Python的基础语法和知识,帮助0基础的小伙伴入门和学习Python,感兴趣的小伙伴可以开始认真学习啦!一、Python简介【了解】1.计算机工作原理编程语言就是用来定义计算机程序的形式语言。我们通过编程语言来编写程序代码,再通过语言处理程序执行向计算机发送指令,让计算机完成对应的工作,编程
python八股文面试题分享及解析(1)
Shawn________
python
#1.'''a=1b=2不用中间变量交换a和b'''#1.a=1b=2a,b=b,aprint(a)print(b)结果:21#2.ll=[]foriinrange(3):ll.append({'num':i})print(11)结果:#[{'num':0},{'num':1},{'num':2}]#3.kk=[]a={'num':0}foriinrange(3):#0,12#可变类型,不仅仅改变
每日算法&面试题,大厂特训二十八天——第二十天(树)
肥学
⚡算法题⚡面试题每日精进 java 算法 数据结构
目录标题导读算法特训二十八天面试题点击直接资料领取导读肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!特别介绍小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章
Python快速入门 —— 第三节:类与对象
孤华暗香
Python快速入门 python 开发语言
第三节:类与对象目标:了解面向对象编程的基础概念,并学会如何定义类和创建对象。内容:类与对象:定义类:class关键字。类的构造函数:__init__()。类的属性和方法。对象的创建与使用。示例:classStudent:def__init__(self,name,age,major):self.name
pyecharts——绘制柱形图折线图
2224070247
信息可视化 python java 数据可视化
一、pyecharts概述自2013年6月百度EFE(ExcellentFrontEnd)数据可视化团队研发的ECharts1.0发布到GitHub网站以来,ECharts一直备受业界权威的关注并获得广泛好评,成为目前成熟且流行的数据可视化图表工具,被应用到诸多数据可视化的开发领域。Python作为数据分析领域最受欢迎的语言,也加入ECharts的使用行列,并研发出方便Python开发者使用的数据
Python 实现图片裁剪(附代码) | Python工具
剑客阿良_ALiang
前言本文提供将图片按照自定义尺寸进行裁剪的工具方法,一如既往的实用主义。环境依赖ffmpeg环境安装,可以参考我的另一篇文章:windowsffmpeg安装部署_阿良的博客-CSDN博客本文主要使用到的不是ffmpeg,而是ffprobe也在上面这篇文章中的zip包中。ffmpy安装:pipinstallffmpy-ihttps://pypi.douban.com/simple代码不废话了,上代码
【华为OD技术面试真题 - 技术面】- python八股文真题题库(4)
算法大师
华为od 面试 python
华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选**1.Python中的`with`**用途和功能自动资源管理示例:文件操作上下文管理协议示例代码工作流程解析优点2.\_\_new\_\_和**\_\_init\_\_**区别__new____init__区别总结3.**切片(Slicing)操作**基本切片语法
python os 环境变量
CV矿工
python 开发语言 numpy
环境变量:环境变量是程序和操作系统之间的通信方式。有些字符不宜明文写进代码里,比如数据库密码,个人账户密码,如果写进自己本机的环境变量里,程序用的时候通过os.environ.get()取出来就行了。os.environ是一个环境变量的字典。环境变量的相关操作importos"""设置/修改环境变量:os.environ[‘环境变量名称’]=‘环境变量值’#其中key和value均为string类
Python爬虫解析工具之xpath使用详解
eqa11
python 爬虫 开发语言
文章目录Python爬虫解析工具之xpath使用详解一、引言二、环境准备1、插件安装2、依赖库安装三、xpath语法详解1、路径表达式2、通配符3、谓语4、常用函数四、xpath在Python代码中的使用1、文档树的创建2、使用xpath表达式3、获取元素内容和属性五、总结Python爬虫解析工具之xpath使用详解一、引言在Python爬虫开发中,数据提取是一个至关重要的环节。xpath作为一门
【华为OD技术面试真题 - 技术面】- python八股文真题题库(1)
算法大师
华为od 面试 python
华为OD面试真题精选专栏:华为OD面试真题精选目录:2024华为OD面试手撕代码真题目录以及八股文真题目录文章目录华为OD面试真题精选1.数据预处理流程数据预处理的主要步骤工具和库2.介绍线性回归、逻辑回归模型线性回归(LinearRegression)模型形式:关键点:逻辑回归(LogisticRegression)模型形式:关键点:参数估计与评估:3.python浅拷贝及深拷贝浅拷贝(Shal
nosql数据库技术与应用知识点
皆过客,揽星河
NoSQL nosql 数据库 大数据 数据分析 数据结构 非关系型数据库
Nosql知识回顾大数据处理流程数据采集(flume、爬虫、传感器)数据存储(本门课程NoSQL所处的阶段)Hdfs、MongoDB、HBase等数据清洗(入仓)Hive等数据处理、分析(Spark、Flink等)数据可视化数据挖掘、机器学习应用(Python、SparkMLlib等)大数据时代存储的挑战(三高)高并发(同一时间很多人访问)高扩展(要求随时根据需求扩展存储)高效率(要求读写速度快)
《Python数据分析实战终极指南》
xjt921122
python 数据分析 开发语言
对于分析师来说,大家在学习Python数据分析的路上,多多少少都遇到过很多大坑**,有关于技能和思维的**:Excel已经没办法处理现有的数据量了,应该学Python吗?找了一大堆Python和Pandas的资料来学习,为什么自己动手就懵了?跟着比赛类公开数据分析案例练了很久,为什么当自己面对数据需求还是只会数据处理而没有分析思路?学了对比、细分、聚类分析,也会用PEST、波特五力这类分析法,为啥
Python中深拷贝与浅拷贝的区别
yuxiaoyu.
转自:http://blog.csdn.net/u014745194/article/details/70271868定义:在Python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。也就是,把对象复制一遍,但是该对象中引用的其他对象我不复
Python开发常用的三方模块如下:
换个网名有点难
python 开发语言
Python是一门功能强大的编程语言,拥有丰富的第三方库,这些库为开发者提供了极大的便利。以下是100个常用的Python库,涵盖了多个领域:1、NumPy,用于科学计算的基础库。2、Pandas,提供数据结构和数据分析工具。3、Matplotlib,一个绘图库。4、Scikit-learn,机器学习库。5、SciPy,用于数学、科学和工程的库。6、TensorFlow,由Google开发的开源机
Python编译器
鹿鹿~
Python编译器 Python python 开发语言 后端
嘿嘿嘿我又来了啊有些小盆友可能不知道Python其实是有编译器的,也就是PyCharm。你们可能会问到这个是干嘛的又不可以吃也不可以穿好像没有什么用,其实你还说对了这个还真的不可以吃也不可以穿,但是它用来干嘛的呢。用来编译你所打出的代码进行运行(可能这里说的有点不对但是只是个人认为)现在我们来说说PyCharm是用来干嘛的。PyCharm是一种PythonIDE,带有一整套可以帮助用户在使用Pyt
一文掌握python面向对象魔术方法(二)
程序员neil
python python 开发语言
接上篇:一文掌握python面向对象魔术方法(一)-CSDN博客目录六、迭代和序列化:1、__iter__(self):定义迭代器,使得类可以被for循环迭代。2、__getitem__(self,key):定义索引操作,如obj[key]。3、__setitem__(self,key,value):定义赋值操作,如obj[key]=value。4、__delitem__(self,key):定义
一文掌握python常用的list(列表)操作
程序员neil
python python 开发语言
目录一、创建列表1.直接创建列表:2.使用list()构造器3.使用列表推导式4.创建空列表二、访问列表元素1.列表支持通过索引访问元素,索引从0开始:2.还可以使用切片操作访问列表的一部分:三、修改列表元素四、添加元素1.append():在末尾添加元素2.insert():在指定位置插入元素五、删除元素1.del:删除指定位置的元素2.remove():删除指定值的第一个匹配项3.pop():
Python实现简单的机器学习算法
master_chenchengg
python python 办公效率 python开发 IT
Python实现简单的机器学习算法开篇:初探机器学习的奇妙之旅搭建环境:一切从安装开始必备工具箱第一步:安装Anaconda和JupyterNotebook小贴士:如何配置Python环境变量算法初体验:从零开始的Python机器学习线性回归:让数据说话数据准备:从哪里找数据编码实战:Python实现线性回归模型评估:如何判断模型好坏逻辑回归:从分类开始理论入门:什么是逻辑回归代码实现:使用skl
python中的深拷贝与浅拷贝
anshejd70787
python
深拷贝和浅拷贝浅拷贝的时候,修改原来的对象,浅拷贝的对象不会发生改变。1、对象的赋值对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。当对对象做赋值或者是参数传递或者作为返回值的时候,总是传递原始对象的引用,而不是一个副本。如下所示:>>>aList=["kel","abc",123]>>>bLis
用Python实现简单的猜数字游戏
程序媛了了
python 游戏 java
猜数字游戏代码:importrandomdefpythonit():a=random.randint(1,100)n=int(input("输入你猜想的数字:"))whilen!=a:ifn>a:print("很遗憾,猜大了")n=int(input("请再次输入你猜想的数字:"))elifna::如果玩家猜的数字n大于随机数字a,则输出"很遗憾,猜大了",并提示玩家再次输入。elifn
用Python实现读取统计单词个数
程序媛了了
python 游戏 java
完整实例代码:fromcollectionsimportCounterdefpythonit():danci={}withopen("pythonit.txt","r",encoding="utf-8")asf:foriinf:words=i.strip().split()forwordinwords:ifwordnotindanci:danci[word]=1else:danci[word]+=
Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor
yangshangchuan
信息抽取 HtmlExtractor 精准抽取 信息采集
HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件,本身并不包含爬虫功能,但可被爬虫或其他程序调用以便更精准地对网页结构化信息进行抽取。
HtmlExtractor是为大规模分布式环境设计的,采用主从架构,主节点负责维护抽取规则,从节点向主节点请求抽取规则,当抽取规则发生变化,主节点主动通知从节点,从而能实现抽取规则变化之后的实时动态生效。
如
java编程思想 -- 多态
百合不是茶
java 多态详解
一: 向上转型和向下转型
面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。父类:人 子类:男人向上转型: Person p = new Man() ; //向上转型不需要强制类型转化向下转型: Man man =
[自动数据处理]稳扎稳打,逐步形成自有ADP系统体系
comsci
dp
对于国内的IT行业来讲,虽然我们已经有了"两弹一星",在局部领域形成了自己独有的技术特征,并初步摆脱了国外的控制...但是前面的路还很长....
首先是我们的自动数据处理系统还无法处理很多高级工程...中等规模的拓扑分析系统也没有完成,更加复杂的
storm 自定义 日志文件
商人shang
storm cluster logback
Storm中的日志级级别默认为INFO,并且,日志文件是根据worker号来进行区分的,这样,同一个log文件中的信息不一定是一个业务的,这样就会有以下两个需求出现:
1. 想要进行一些调试信息的输出
2. 调试信息或者业务日志信息想要输出到一些固定的文件中
不要怕,不要烦恼,其实Storm已经提供了这样的支持,可以通过自定义logback 下的 cluster.xml 来输
Extjs3 SpringMVC使用 @RequestBody 标签问题记录
21jhf
springMVC使用 @RequestBody(required = false) UserVO userInfo
传递json对象数据,往往会出现http 415,400,500等错误,总结一下需要使用ajax提交json数据才行,ajax提交使用proxy,参数为jsonData,不能为params;另外,需要设置Content-type属性为json,代码如下:
(由于使用了父类aaa
一些排错方法
文强chu
方法
1、java.lang.IllegalStateException: Class invariant violation
at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199)at org.apache.log4j.LogManager.getLogger(LogManager.java:228)
at o
Swing中文件恢复我觉得很难
小桔子
swing
我那个草了!老大怎么回事,怎么做项目评估的?只会说相信你可以做的,试一下,有的是时间!
用java开发一个图文处理工具,类似word,任意位置插入、拖动、删除图片以及文本等。文本框、流程图等,数据保存数据库,其余可保存pdf格式。ok,姐姐千辛万苦,
php 文件操作
aichenglong
PHP 读取文件 写入文件
1 写入文件
@$fp=fopen("$DOCUMENT_ROOT/order.txt", "ab");
if(!$fp){
echo "open file error" ;
exit;
}
$outputstring="date:"." \t tire:".$tire."
MySQL的btree索引和hash索引的区别
AILIKES
数据结构 mysql 算法
Hash 索引结构的特殊性,其 检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢
JAVA的抽象--- 接口 --实现
百合不是茶
抽象 接口 实现接口
//抽象 类 ,方法
//定义一个公共抽象的类 ,并在类中定义一个抽象的方法体
抽象的定义使用abstract
abstract class A 定义一个抽象类 例如:
//定义一个基类
public abstract class A{
//抽象类不能用来实例化,只能用来继承
//
JS变量作用域实例
bijian1013
作用域
<script>
var scope='hello';
function a(){
console.log(scope); //undefined
var scope='world';
console.log(scope); //world
console.log(b);
TDD实践(二)
bijian1013
java TDD
实践题目:分解质因数
Step1:
单元测试:
package com.bijian.study.factor.test;
import java.util.Arrays;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import com.bijian.
[MongoDB学习笔记一]MongoDB主从复制
bit1129
mongodb
MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。
事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。 本文介绍MongoDB的主从复制模式,需要指明
【HBase五】Java API操作HBase
bit1129
hbase
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.ha
python调用zabbix api接口实时展示数据
ronin47
zabbix api接口来进行展示。经过思考之后,计划获取如下内容: 1、 获得认证密钥 2、 获取zabbix所有的主机组 3、 获取单个组下的所有主机 4、 获取某个主机下的所有监控项  
jsp取得绝对路径
byalias
绝对路径
在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:
一、使用${pageContext.request.contextPath}
代码” ${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。
Java定时任务调度:用ExecutorService取代Timer
bylijinnan
java
《Java并发编程实战》一书提到的用ExecutorService取代Java Timer有几个理由,我认为其中最重要的理由是:
如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被
SQL 优化原则
chicony
sql
一、问题的提出
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统
java 线程弹球小游戏
CrazyMizzz
java 游戏
最近java学到线程,于是做了一个线程弹球的小游戏,不过还没完善
这里是提纲
1.线程弹球游戏实现
1.实现界面需要使用哪些API类
JFrame
JPanel
JButton
FlowLayout
Graphics2D
Thread
Color
ActionListener
ActionEvent
MouseListener
Mouse
hadoop jps出现process information unavailable提示解决办法
daizj
hadoop jps
hadoop jps出现process information unavailable提示解决办法
jps时出现如下信息:
3019 -- process information unavailable3053 -- process information unavailable2985 -- process information unavailable2917 --
PHP图片水印缩放类实现
dcj3sjt126com
PHP
<?php
class Image{
private $path;
function __construct($path='./'){
$this->path=rtrim($path,'/').'/';
}
//水印函数,参数:背景图,水印图,位置,前缀,TMD透明度
public function water($b,$l,$pos
IOS控件学习:UILabel常用属性与用法
dcj3sjt126com
ios UILabel
参考网站:
http://shijue.me/show_text/521c396a8ddf876566000007
http://www.tuicool.com/articles/zquENb
http://blog.csdn.net/a451493485/article/details/9454695
http://wiki.eoe.cn/page/iOS_pptl_artile_281
完全手动建立maven骨架
eksliang
java eclipse Web
建一个 JAVA 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=App
[-Dversion=0.0.1-SNAPSHOT]
[-Dpackaging=jar]
建一个 web 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=web-a
配置清单
gengzg
配置
1、修改grub启动的内核版本
vi /boot/grub/grub.conf
将default 0改为1
拷贝mt7601Usta.ko到/lib文件夹
拷贝RT2870STA.dat到 /etc/Wireless/RT2870STA/文件夹
拷贝wifiscan到bin文件夹,chmod 775 /bin/wifiscan
拷贝wifiget.sh到bin文件夹,chm
Windows端口被占用处理方法
huqiji
windows
以下文章主要以80端口号为例,如果想知道其他的端口号也可以使用该方法..........................1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等. 这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入&
开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !
天梯梦
mobile
CKplayer,其全称为超酷flv播放器,它是一款用于网页上播放视频的软件,支持的格式有:http协议上的flv,f4v,mp4格式,同时支持rtmp视频流格 式播放,此播放器的特点在于用户可以自己定义播放器的风格,诸如播放/暂停按钮,静音按钮,全屏按钮都是以外部图片接口形式调用,用户根据自己的需要制作 出播放器风格所需要使用的各个按钮图片然后替换掉原始风格里相应的图片就可以制作出自己的风格了,
简单工厂设计模式
hm4123660
java 工厂设计模式 简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
maven笔记
zhb8015
maven
跳过测试阶段:
mvn package -DskipTests
临时性跳过测试代码的编译:
mvn package -Dmaven.test.skip=true
maven.test.skip同时控制maven-compiler-plugin和maven-surefire-plugin两个插件的行为,即跳过编译,又跳过测试。
指定测试类
mvn test
非mapreduce生成Hfile,然后导入hbase当中
Stark_Summer
map hbase reduce Hfile path实例
最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式,但是网上多是用mapreduce来实现入库,而现在的需求是实时入库,不生成文件了,所以就只能自己用代码实现了,但是网上查了很多资料都没有查到,最后在一个网友的指引下,看了源码,最后找到了生成Hfile
jsp web tomcat 编码问题
王新春
tomcat jsp pageEncode
今天配置jsp项目在tomcat上,windows上正常,而linux上显示乱码,最后定位原因为tomcat 的server.xml 文件的配置,添加 URIEncoding 属性:
<Connector port="8080" protocol="HTTP/1.1"
connectionTi