python查询百度收录(多线程版)

查询收录数,收录率,未收录链接,收录的链接
需要安装pycurl模块
需要查询的URL放在url.csv里面文件必须是utf-8格式
运行BDshoulu.py文件
在Windows下面的命令提示符下运行会乱码,print的内容会乱码,请自行转码,不影响结果。
遇到验证码的时候会停止5分钟重新查
线程建议不要开太多,否则会导致封IP

 Python |  copy code |? 
001
#coding:utf-8
002
import pycurl,re,StringIO
003
import  threading,Queue,time
004
 
005
class caiji:
006
	#打开网页  url:网页URL
007
	def html(self,url):
008
		while 1:
009
			try:
010
				b=StringIO.StringIO()
011
				c=pycurl.Curl()
012
				c.setopt(pycurl.URL,url) #打开URL
013
				c.setopt(pycurl.FOLLOWLOCATION,2) #允许跟踪来源,有参数:1和2
014
				c.setopt(pycurl.ENCODING, 'gzip')  #开启gzip压缩提高下载速度
015
				c.setopt(pycurl.NOSIGNAL, True)   #开启后多线程不会报错
016
				c.setopt(pycurl.MAXREDIRS,1) #最大重定向次数,0表示不重定向
017
				c.setopt(pycurl.CONNECTTIMEOUT,60) #链接超时
018
				c.setopt(pycurl.TIMEOUT,30)  #下载超时
019
				c.setopt(pycurl.USERAGENT,'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)')
020
				#pycurl.USERAGENT  模拟浏览器
021
				c.setopt(pycurl.WRITEFUNCTION, b.write)  #回调写入字符串缓存
022
				c.perform() #执行上述访问网址的操作
023
				# print c.getinfo(pycurl.HTTP_CODE)
024
				c.close()
025
				html=b.getvalue()   #读取b中的数据
026
				return html    #跳出并返回html
027
			except:
028
				continue
029
 
030
 
031
wurl=open(r"url1.csv",'a')
032
 
033
caiji=caiji()
034
 
035
class count:
036
	def __init__(self):
037
		self.shoulu=0
038
		self.wshoulu=0
039
		self.i=0
040
		self.lock=threading.Lock()
041
 
042
 
043
	def c_wshoulu(self):
044
		self.lock.acquire()
045
		self.wshoulu+=1
046
		wshoulu=self.wshoulu
047
		self.lock.release()
048
		return wshoulu
049
 
050
 
051
	def c_sl(self):
052
		self.lock.acquire()
053
		self.shoulu+=1
054
		shoulu=self.shoulu
055
		self.lock.release()
056
		return shoulu
057
 
058
 
059
	def c_i(self):
060
		self.lock.acquire()
061
		self.i+=1
062
		i=self.i
063
		self.lock.release()
064
		return i
065
 
066
count=count()
067
 
068
class th(threading.Thread):
069
	def __init__(self,qurl):
070
		threading.Thread.__init__(self)
071
		self.qurl=qurl
072
		self.lock=threading.Lock()
073
		self.cond=threading.Condition()
074
 
075
 
076
	def run(self):
077
		while 1:
078
			ddc=self.qurl.get()
079
			if ddc is  None:
080
				break
081
			while 1:
082
				bdhtm=caiji.html('http://www.baidu.com/s?wd='+ddc)
083
				self.lock.acquire()
084
 
085
				if '百度为您找到相关结果约' in bdhtm:
086
					i=count.c_i()
087
					print '第%s条, %s ,收录'% (i,ddc)
088
					wurl.writelines('第%s条, %s ,收录\n'% (i,ddc))
089
					count.c_sl()
090
					break
091
 
092
				elif '抱歉,没有找到与' in bdhtm:
093
					i=count.c_i()
094
					print '第%s条, %s ,未收录'% (i,ddc)
095
					wurl.writelines('第%s条, %s ,未收录\n'% (i,ddc))
096
					count.c_wshoulu()
097
					break
098
 
099
				elif 'http://verify.baidu.com/' in bdhtm:
100
					print ddc,'出现验证码,等待5分钟后自动开始'
101
					self.lock.release()
102
					time.sleep(500)
103
					continue
104
 
105
				else:
106
					print 'Error'
107
					break
108
			self.lock.release()
109
 
110
 
111
qurl=Queue.Queue(0)
112
threadCount=6    #开启线程数,默认6个线程
113
 
114
ths=[]
115
for t in range(threadCount):
116
	thread=th(qurl)
117
	thread.start()
118
	ths.append(thread)
119
 
120
for ddc in open(r'url.csv'):   #导入需要查询的URL文件,格式必须是utf-8
121
	ddc=ddc[0:-1]
122
	qurl.put(ddc)
123
 
124
for tt in range(threadCount):
125
	qurl.put(None)
126
 
127
for t in ths:
128
	t.join()
129
 
130
sl=count.c_sl()-1
131
 
132
print  '\n收录率:'+str(round(float(sl)/float(count.c_i()-1)*100,2)),"%"
133
print '收录:%s 条'%str(sl)
134
print '未收录:%s 条'%str(count.c_wshoulu()-1)
135
 
136
 
137

分享下百度牛站PK采集到的数据和代码

据我观察这数据是pc端的点击量。

晒个图:

1111 分享下百度牛站PK采集到的数据和代码

附件里面有代码:

如果想继续采集的话双击:niuzhanuv.py
数据是采集来的原始数据,最后运行下:fenxi.py就可以看到上图数据了,自己用excel排序下。程序里懒得搞。
脚本一秒钟采集一次,之前采的太快直接被封了,哭。

下载:baidu_uv

python计算关键字长度

有时候我们会根据关键字长度对关键字进行分类,分享下使用python的实现方式:

1.主要使用python的len()函数计算每个字符的字节数,由于中文一个字为3个字节(utf-8编码下),英文为1个字节,所以这里的处理需要区别对待,我想到的办法是分别处理两种状态,使用正则表达式的\w和\W来提取中英文。

2.排序,计算好每个关键字长度后,需要对其进行排序,这里使用了字典排序功能,关键字做key,关键字长度做value(需要注意的是不可以使用关键字长度做key,因为很多关键字长度是相同的,那么必然会被替换掉,这不是我们想要的,且关键字长度添加到字典里面去的时候必须是int(),否则排序时候不会当作数值处理)。

 Python |  copy code |? 
01
#coding:utf-8
02
#计算关键字长度并排序
03
#2014年4月11日 23:41:58
04
#by M.Shan
05
#需处理数据格式:关键字,URL
06
import re,csv
07
key=csv.reader(file('uz.csv','rb'))
08
key1=open('uz1.csv','w')
09
zidian={}
10
lists=[]
11
 
12
for line in key:
13
	reges=re.compile(r'\w',re.M)
14
	E=reges.findall(line[0])   #获取数字和英文
15
 
16
	reges1=re.compile(r'\W',re.M)
17
	C=reges1.findall(line[0])  #获取到中文
18
 
19
	English= len(E)  #获取英文长度
20
	China=len(C)/3   #获取中文长度,中文一个汉字3个字节,除以3得到汉字个数
21
	length=line[0]+','+line[1]+','+`English+China`
22
	lists.append(length)
23
 
24
for ls in lists:
25
	ls=ls.split(',')
26
	ls_value=int(ls[2])      #这一步必须转成int,否则下面的字典排序的时候不会当作数值处理,而是当作字符来处理,导致排序错误
27
	ls_key=ls[0]+','+ls[1]
28
	zidian1={ls_key:ls_value}
29
	zidian.update(zidian1)
30
 
31
cc=sorted(zidian.items(), key=lambda d:d[1], reverse=True )   #字典排序之降序,针对字典value排序(d:d[1]), reverse=true为降序
32
 
33
for key in cc:    #keys()字典的键值
34
	key1.writelines(key[0]+","+`key[1]`+"\n" )   #文件写入key1
35
	print key[0]+","+`key[1]`    #分别输出里面的数
36
 
37
key1.close()

处理后截图:

111 python计算关键字长度

计算文章权重TF-IDF。

嗯。tf-idf是个好东西,有必要计算下。下面是python下的jieba模块实现的文章tf-idf的计算结果。

 Python |  copy code |? 
01
#coding:utf-8
02
import jieba
03
import jieba.analyse    #计算tf-idf需要调用此模块jieba.analyse
04
stopkey=[line.strip().decode('utf-8') for line in open('stopkey.txt').readlines()] 
05
#将停止词文件保存到列表stopkey,停止词在网上下载的。
06
neirong = open(r"ceshi1.txt","r").read()  #导入需要计算的内容
07
zidian={}
08
fenci=jieba.cut_for_search(neirong)   #搜索引擎模式分词
09
for fc in fenci:
10
        if fc in zidian:                
11
                zidian[fc]+=1           #字典中如果存在键,键值加1,
12
        else:
13
                zidian.setdefault(fc,1)   #字典中如果不存在键,就加入键,键值设置为1
14
quanzhong=jieba.analyse.extract_tags(neirong,topK=20)       #计算tf-idf,输出前20的权重词。
15
for qg in quanzhong:
16
        if qg in stopkey:       #如果qg存在停止词stopkey里面,则pass
17
                pass
18
        else:                                        #不存在的话就输出qg和出现qg的次数
19
                print qg+","+`zidian[qg]`       #输出权重词和权重词出现的次数
20

以zero以前的一篇文章“TF-IDF框架与其可以衍生到的SEO知识”内容为例,输出结果是:QQ截图20140331110724 201x300 计算文章权重TF IDF。

python利用jieba分词进行分词,去停止词(停用词)。

上一篇文章介绍了利用python进行SEO词库去重,去重后需要对现有的词库进行去停止词操作,这里我们主要利用到了jieba分词的搜索引擎模式cut_for_search() .

去停止词主要利用了停止词词库进行去重set(jiebas)-set(stopkey)

 Python |  copy code |? 
01
#coding:utf-8
02
import jieba,csv
03
fenci=open(r'fenci_ddc.csv','w')  #数据写入到fenci_key里
04
stopkey=[line.strip().decode('utf-8') for line in open('stopkey.txt').readlines()]  
05
	#读取停止词文件并保存到列表stopkey
06
key=csv.reader(file('key_ddc.csv','rb'))  #读取需要处理的词库:key_ddc.csv
07
list1=[]
08
i=0
09
 
10
for keys in key:
11
 
12
	if i==0:	
13
		i=1
14
		jiebas=jieba.cut_for_search(keys[0]) #jieba.cut_for_search() 结巴分词搜索引擎模式		
15
		fenci_key="/".join(list(set(jiebas)-set(stopkey))) #使用join链接字符串输出
16
		list1.append(fenci_key.strip())  #将数据添加到list1列表
17
		print u'程序处理中,请等待...'
18
	else:
19
		jiebas=jieba.cut_for_search(keys[0]) 
20
		fenci_key="/".join(list(set(jiebas)-set(stopkey))) 
21
		list1.append(fenci_key.strip()) 
22
 
23
zidian={}.fromkeys(list1).keys()    #字典去重的方法
24
 
25
for zd  in zidian:
26
	try:
27
		print zd
28
	except:
29
		pass
30
	fenci.writelines(zd.encode('utf-8'))      #需要转换成utf-8格式输出
31
	fenci.writelines('\n')
32
 
33
fenci.close()
34
 
35
 
36
 
37
 
38
 
39

python实现seo词库去重脚本—定制版

之前分享了一个python实现数据去重的脚本,对付一般的需求足以满足,但是针对seo词库的特殊去重,需要做些改变,原理都一样,使用字典键的唯一性来实现我们的目标。(针对同一个词库(600w行)使用这个脚本去重比之前的脚本多去掉了一万多行的重复数据),下面贴出代码

 Python |  copy code |? 
01
#coding:utf-8
02
#词库的数据格式为:
03
#关键字,日搜索量,月搜索量
04
#爱玛,2,4
05
#雅迪,2,5
06
#绿源,3,55
07
 
08
ciku=open(r'ciku1.csv','r')   #打开需要去重文件,可自行修改
09
xieru=open(r'ciku.csv','w')  #去重的文件保存到ciku.csv去,可自行修改
10
cikus=ciku.readlines()
11
zidian={}   #创建个空字典
12
for x in cikus:
13
	try:
14
		x=x.split(',')    #sqlit 切割,通过字符串‘,’切割。
15
		x1=x[0]
16
		leng=len(x)      
17
		if leng==3:		#判断列表长度是否是3,不是3证明词库数据有一定的问题,舍弃,预防报错。
18
			x2=x[1]+','+x[2]
19
			zidian1={x1:x2}        #关键字为键,后面的为值
20
			zidian.update(zidian1)   #update添加到字典,类似列表的append的用法,向zidian里面添加zidian1
21
	except ValueError :
22
		pass
23
for key in zidian.keys():
24
	ci=key+','+zidian[key]
25
	try:
26
		print ci[0:-1].decode('utf-8').encode('gbk')
27
	except ValueError:
28
		pass
29
	xieru.writelines(ci)
30
ciku.close()
31
xieru.close()
32

python实现文件切割(支持txt ,csv等)

今天群里一基友需要做文件切割。顺手写了个python脚本。分享了。

 Python |  copy code |? 
01
#coding:utf-8
02
ysfile=open(r'ceshi.csv','r')   #file.txt是需要切割的文件。
03
qiege=3   #默认切割成3个文件,需要切割成多少个文件在这里修改。
04
readfiles=ysfile.readlines()
05
leng=len(readfiles)
06
leng=leng/qiege
07
i=0
08
x=1
09
qg=`x`+'.txt'
10
qiegefile=open(qg,'w')
11
for line in readfiles:
12
	try:
13
		print line[0:-1]	
14
		if i>leng:
15
			x+=1
16
			i=0
17
			qg=`x`+'.txt'
18
			qiegefile.close()
19
			qiegefile=open(qg,'w')
20
		i+=1
21
		qiegefile.writelines(line)
22
	except ValueError :
23
		pass
24
qiegefile.close()
25
 
26
 
27

使用python实现文件去重(一般性的文本处理)

在实际工作中经常会遇到很多重复的信息,需要我们做去重复处理,今天下午写了个python的脚本实现文件去重功能,这个脚本能够满足大部分非特定的需求,但是针对seo词库仍然无法满足需求,分享给大家(针对seo词库的去重请查看python实现seo词库去重脚本—定制版处理数据的速度一般,可以接受,测试了下,上个厕所的时间处理了600万行数据。

 Python |  copy code |? 
01
#coding:utf-8
02
ciku=open(r'all.csv','r')   #打开需要去重文件
03
xieci=open(r'quchong.csv','w')   #打开处理后存放的文件
04
cikus=ciku.readlines() 
05
list2 = {}.fromkeys(cikus).keys()     #列表去重方法,将列表数据当作字典的键写入字典,依据字典键不可重复的特性去重
06
i=1
07
for line in list2:
08
	if line[0]!=',':
09
		# print line[0:-1].decode('utf-8').encode('gbk')   #数据量太多,会出现编码报错。蛋疼
10
		print  u"写入第:"+`i`+u" 个"
11
		i+=1
12
		xieci.writelines(line)
13
xieci.close()