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,爬虫,开发语言)
Python day18
赵英英俊
Python训练 python
@浙大疏锦行pythonday18.内容:昨天学习了聚类算法的一些基本内容,今天继续学习相关知识分析簇的特征和相关含义(使用可视化来进行分析,也可以使用ai)代码:shap.initjs()#初始化SHAP解释器explainer=shap.TreeExplainer(model)shap_values=explainer.shap_values(x1)#这个计算耗时shap_values.sha
【完全掌握】PyPDF2/PyPDF4深度指南:Python轻松实现PDF读取与操作的15个高级技巧
莫比乌斯@卷
技术技巧 # 文档处理扩展 python pdf 服务器
【完全掌握】PyPDF2/PyPDF4深度指南:Python轻松实现PDF读取与操作的15个高级技巧1.PDF库基础了解1.1PyPDF2与PyPDF4的关系与选择PyPDF2是一个历史悠久的PythonPDF处理库,而PyPDF4是其改进和维护的分支版本:#安装PyPDF2pipinstallPyPDF2#或安装PyPDF4(推荐)pipinstallPyPDF4PyPDF4相比PyPDF2有以
【华为OD机试真题 2025C卷】161、 机器人可活动的最大网格点数目 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)
KFickle
最新华为OD机试(C++ Java Py C JS)+OJ 华为od 机器人 c++ 华为OD机试真题 java 机器人可活动的最大网格点数目 c语言
文章目录一、题目题目描述输入输出样例1二、代码与思路参考C++代码Java代码Python代码C语言代码JS代码订阅本专栏后即可解锁在线OJ刷题权限个人博客首页:KFickle专栏介绍:最新的华为OD机试真题,使用C++,Java,Python,C语言,JS五种语言进行解答,每个题目都包含解题思路,五种语言的解法,每日持续更新中,订阅后支持开通在线OJ测试刷题!!!一次订阅永久享受更新,有代码问题
零基础Python入门(1)——手把手安装PyCharm并打印Hello World
名字都被谁用了
Python入门 python pycharm 开发语言
一、Python开发环境全攻略1.1Python的"身份证"——版本选择指南Python目前主流版本分为2.x和3.x两大分支,官方已于2020年正式停止对Python2的维护。对于新手,我们强烈建议选择Python3.10及以上版本。这个版本区间既保留了经典语法特性,又支持最新语法糖(如模式匹配),同时具备良好的第三方库兼容性。版本号小知识:3.10.6中的3表示大版本10代表功能版本6是维护版
用ESP8266和MicroPython打造WiFi智能遥控小车:从入门到实战
项目概述:WiFi控制的创新体验在物联网技术飞速发展的今天,传统遥控小车早已无法满足创客们的探索欲望。本文将介绍一个基于ESP8266和MicroPython的WiFi遥控小车项目,通过两个ESP8266模块实现无线通信,让你摆脱传统遥控器的束缚,体验物联网控制的乐趣。核心功能亮点WiFi无线控制:无需传统射频模块,通过WiFi网络实现远程操控双ESP8266架构:一个作为车载接收端,一个作为手持
PyCharm高效入门指南:快速提升Python开发效率
famenzhiling
python pycharm ide
1.引言PyCharm简介:JetBrains开发的Python集成开发环境(IDE),适用于专业开发者和初学者。为什么选择PyCharm:高效代码编辑、智能工具集成和强大的调试功能。目标读者:Python新手或有其他IDE经验但想快速上手PyCharm的用户。2.安装与初始配置下载与安装:访问JetBrains官网下载PyCharmCommunity(免费版)或Professional(付费版)
Postman + Newman + Jenkins 接口自动化测试
Thomas Kant
自动化测试 postman newman jenkins allure
亲爱的技术爱好者们,热烈欢迎来到Kant2048的博客!我是ThomasKant,很开心能在CSDN上与你们相遇~本博客的精华专栏:【自动化测试】【测试经验】【人工智能】【Python】Postman
Python 装饰器使用详解
文章目录0.引言1.什么是装饰器?2.装饰器的基本语法3.装饰器的工作原理4.常见装饰器应用场景4.1.日志记录4.2.权限校验4.3.缓存5.多重装饰器的执行顺序6.装饰器的高级用法6.1.带参数的装饰器6.2.使用`functools.wraps`6.3.类装饰器7.图示说明7.1.单一装饰器的执行流程2.多重装饰器的执行流程3.带参数装饰器的执行流程总结8参考资料0.引言Python装饰器(
豆包教你如何用Python向女生表白
51reboot
一年一度的考试大会又拉开了帷幕其中的一个重头戏就是python了不知道正处于手机前的你为python又掉了多少头发呢but!!!python绝不只是你脱发的工具善于使用你将收获多多比如你知道如何利用python向女生表白吗如果不知道少年,你可要当心啦考试很危险的呢后记:某年月日,某许愿池推文:震惊!某旦python考试题新鲜出炉,考题震惊十几亿中国人!原因竟是。。。待豆包点开推文:一看考试题,嘿哈
python ffmpeg pipe_如何使用python从ffmpeg输出管道?
weixin_39611725
python ffmpeg pipe
我正在尝试将FFmpeg的输出用管道输送到Python中。我正在从一个视频采集卡读取图像,我成功地使用dshow从命令行将其读入输出文件。我正在尝试从卡抓取图像到我的OpenCv代码,以便能够进一步处理数据。不幸的是,当我通过管道输出图像时,我只得到视频的显示,如链接所示:link:s000.tinyupload.com/?file_id=15940665795196022618.我使用的代码如下
python ffmpeg pipe,管道的ffmpeg的输入和输出在python
呼呼啦啦就瘸了
python ffmpeg pipe
I'musingffmpegtocreateavideo,fromalistofbase64encodedimagesthatIpipeintoffmpeg.Outputtingtoafile(usingtheattachedcodebelow)worksperfectly,butwhatIwouldliketoachieveistogettheoutputtoaPythonvariableins
Linux+Python实战课堂:笔记、练习与应用
本文还有配套的精品资源,点击获取简介:本压缩包提供全面的Linux学习资源和Python编程练习,旨在帮助初学者和IT从业者深入理解Linux系统及其技能,并通过Python编程练习巩固相关技能。涵盖Linux基础概念、文件系统、命令行操作、文本编辑器使用、用户和组管理、软件管理、进程监控、网络配置以及系统性能监控等多个方面。同时,包含Python基础语法、函数与模块、面向对象编程、文件操作、异常
Python脚本批量修复文件时间戳,根据文件名或拍摄日期
3D_DLW
储存服务器 python 图片整理 修改时间 批处理脚本 拍摄时间
实现以下功能更正文件的修改时间批量修改指定文件夹中的特定后缀的文件根据文件名中的日期修改(优先)根据jpg文件属性中的拍摄日期修改根据mp4文件属性中的创建媒体日期修改模拟运行(DryRun)模式依赖若需要基于jpg文件属性中的拍摄日期修改,需要python的piexif包pipinstallpiexif若需要基于mp4文件属性中的创建媒体日期修改,需要ffmpegsudoaptinstallff
深入Python闭包内存泄漏:从原理到实战修复指南
清水白石008
Python题库 python python 开发语言
深入Python闭包内存泄漏:从原理到实战修复指南引言:闭包与内存管理的双重挑战在Python编程中,闭包(Closure)作为函数式编程的重要特性,被广泛应用于装饰器、回调函数等场景。然而,当闭包与类实例结合使用时,若处理不当极易引发内存泄漏问题。本文将通过一个典型案例,深入剖析闭包导致内存泄漏的机理,并演示从检测到修复的完整流程,最终提炼出防御性编程的最佳实践。一、内存泄漏闭包案例实录1.1典
Python装饰器与闭包:实战应用与深入理解
背景简介本章深入探讨了Python装饰器与闭包的核心概念,展示了它们在实际编程中的灵活应用和强大功能。装饰器的魔力:保持元数据与链式应用在Python中,装饰器是一种修改或增强函数行为的强大工具,它能够让我们在不改变原始函数代码的情况下,为其添加新功能。保持函数的元数据是装饰器的一个重要特性,它确保了装饰后的函数保持其身份和文档字符串信息。这对于代码的可读性和维护性至关重要。当需要将多个装饰器应用
python闭包的应用场景_简单谈谈Python中的闭包
weixin_39587113
python闭包的应用场景
Python中的闭包前几天又有人留言,关于其中一个闭包和re.sub的使用不太清楚。我在脚本之家搜索了下,发现没有写过闭包相关的东西,所以决定总结一下,完善Python的内容。1.闭包的概念首先还得从基本概念说起,什么是闭包呢?来看下维基上的解释:在计算机科学中,闭包(Closure)是词法闭包(LexicalClosure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在
网络爬虫——python爬取豆瓣评论
SSeaflower
爬虫 python 开发语言
网络爬虫——python爬取豆瓣评论一、网络爬虫概述1.1网络爬虫定义网络爬虫,又被称为网络蜘蛛(WebSpider)、网络机器人等。它根据网页地址(URL)爬取网页内容,网页地址(URL)就是我们在浏览器中输入的网站链接。例如:https://www.baidu.com;https://movie.douban.com/。网络爬虫不仅能够复制网页信息和下载音视频,还可以做到网站的模拟登录和行为链
Python 中的深拷贝、浅拷贝与等号赋值:理解对象复制的本质
小羊苏八
python 开发语言
目录1.等号赋值(=)2.浅拷贝(copy.copy())3.深拷贝(copy.deepcopy())4.不可变对象与可变对象5.性能对比6.实际应用场景7.总结前言在Python中,对象的复制是一个常见的操作,但很多人对深拷贝、浅拷贝和等号赋值之间的区别感到困惑。本文将通过详细的示例和解释,帮助你深入理解这三种操作的本质和应用场景。1.等号赋值(=)在Python中,等号赋值是最基本的对象操作之
Python中的分支结构
小羊苏八
# python python 开发语言
文章目录前言一、Python分支结构概述二、if语句详解三、if-else语句详解四、if-elif-else语句详解五、嵌套分支结构六、分支结构的注意事项七、实际应用场景八、总结前言在Python编程的世界里,分支结构如同现实中的道路岔口,根据不同的条件引导程序流向不同的执行路径。它是构建复杂逻辑、实现智能决策的关键所在。本文将带你全面了解Python的分支结构,从基础语法到实际应用,让你轻松掌
标题 “Python 网络爬虫 —— selenium库驱动浏览器
WeiJingYu.
python 爬虫 selenium
一、Selenium库核心认知Selenium库是Web应用程序测试与自动化操作的利器,能驱动浏览器(如Edge、Firefox等)执行点击、输入、打开、验证等操作。与Requests库差异显著:Requests库仅能获取网页原始代码,而Selenium基于浏览器驱动程序工作,浏览器可渲染网页源代码,借此能轻松拿到渲染后的数据信息(如JS动态加载内容),完美解决Requests库无法处理的动态页面
Python网络爬虫实现selenium对百度识图二次开发以及批量保存Excel
WeiJingYu.
python 爬虫 selenium
一.百度识图自动上传图片fromseleniumimportwebdriverfromselenium.webdriver.edge.optionsimportOptionsfromselenium.webdriver.common.byimportByedge_options=Options()edge_options.binary_location=r"C:\ProgramFiles(x86)
Python关于操作文件夹的讲解——Python 操作文件和文件夹
WeiJingYu.
python 开发语言
借助os库,可完成文件大小查询、文件/文件夹删除、重命名等操作,满足多样化文件管理需求。(一)查询文件大小os库path模块的getsize(path)方法,能获取指定路径文件占用内存大小,单位为字节。字节是计算机存储基本单位,常见存储单位换算关系如下:单位换算关系说明字节(Byte)1字节=8位(bit)存储基本单元千字节(KB)1KB=1024Byte日常文件大小常用表述兆字节(MB)1MB=
Python 网络爬虫 —— 代理服务器
WeiJingYu.
爬虫 服务器 前端
一、会话(Session)(一)核心逻辑HTTP本身无记忆,每次请求独立。会话(Session)就是为解决这问题,让客户端(浏览器)和服务器“记住”交互状态(比如登录态),常用Cookie实现:服务器发Cookie给客户端存着,下次请求带着,服务器就知道“是同一用户”。(二)创建会话(requests实现)用requests库的Session类,自动维持会话、管理Cookie,代码形式:impor
Python 中的闭包:原理、应用与实践
小羊苏八
python 开发语言
目录前言1.什么是闭包?2.闭包的基本结构3.闭包的应用场景4.闭包的高级特性5.闭包的性能与内存管理6.闭包的实践案例7.总结前言在Python编程中,闭包是一个非常强大且灵活的特性。闭包允许嵌套函数访问外部函数的变量,即使外部函数已经返回。这种特性使得闭包在函数式编程、装饰器、回调函数等场景中非常有用。本文将通过详细的示例和解释,深入探讨Python中的闭包。1.什么是闭包?闭包(Closur
python-第五课-绘线段、正方形
布口袋_天晴了
1.绘制第一个海龟图形A.课程内容:通过绘制线段和正方形来学习导入海归模块、创建画笔、移动和旋转画笔。通过绘制图形来学习python编程的基本方法。B.知识点(1)导入海龟绘图模块(2)创建画笔(3)向前移动(4)画笔旋转C.用到的基本指令(1)import(2)turtle.Pen()(3)forward()(4)right()海龟绘图(turle)是python内置的一个比较有趣味的模块。使用
python爬虫技术——基础知识、实战
南瓜AI
python 爬虫 scrapy
参考文献:Python爬虫入门(一)(适合初学者)-CSDN博客一、常用爬虫工具包Scrapy语言:Python特点:高效、灵活的爬虫框架,适合大型爬虫项目。BeautifulSoup语言:Python特点:用于解析HTML和XML,简单易用。Selenium语言:Python/Java/C#特点:支持浏览器自动化,适合处理JavaScript渲染的网页。Requests语言:Python特点:简
分享两个爬虫练习网站
高质量海王哦
爬虫 爬虫 python
Python爬虫案例|ScrapeCenterSpiderbuf|Python爬虫练习靶场
Python之print打印
追捕的风
Python之数据处理 python 开发语言 爬虫
python是一门脚本语言,少不了使用各种print打印调试,本文总结一下pythonprint打印的几种方法。1单独打印变量1.1只打印变量:方法:print(variable)示例:name="Mike"age=21print(name)print(age)输出:Mike211.2带其他信息:示例:name="Mike"age=21print('mynameis',name)print('my
python3——print使用
weixin_30404405
print的初步认识:对于科班出身的或有相关经验的人来说,学习python是相当有趣的事,因为可以做日常任务,比如自动备份你的MP3;可以做网站,如YouTube就是Python写的;可以做网络游戏的后台,很多在线游戏的后台都是Python开发的;可以爬数据,得到你想要的内容。总之就是能干很多很多事啦。而对于非科班的我来说,学习python是非常辛苦的,从一行行print打印,到一个个关键字,从思
DAY2——Python 基础变量类型之字符串和数字类型
.venn
PYTHON学习 python 开发语言 算法
字符串类型(str)字符串是Python中最常用的数据类型之一,用于表示文本信息。字符串可以用单引号('')、双引号("")或三引号(''''''或"""""")定义。三引号通常用于多行字符串。字符串是不可变序列,支持索引和切片操作。以下是一些常见操作:#定义字符串s1='hello's2="world"s3='''Thisisamulti-linestring'''#字符串拼接combined=
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