发现更大的SEO世界
 找回密码
 注册
搜索
»首页»SEO培训 SEO论坛 SEO交流 帖子
发新帖
莫山,改我论坛密码的没有小JJ,哼!!!    

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

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

  1. #coding:utf-8
  2. import pycurl,re,StringIO
  3. import  threading,Queue,time

  4. class caiji:
  5.         #打开网页  url:网页URL
  6.         def html(self,url):
  7.                 while 1:
  8.                         try:
  9.                                 b=StringIO.StringIO()
  10.                                 c=pycurl.Curl()
  11.                                 c.setopt(pycurl.URL,url) #打开URL
  12.                                 c.setopt(pycurl.FOLLOWLOCATION,2) #允许跟踪来源,有参数:1和2
  13.                                 c.setopt(pycurl.ENCODING, 'gzip')  #开启gzip压缩提高下载速度
  14.                                 c.setopt(pycurl.NOSIGNAL, True)   #开启后多线程不会报错
  15.                                 c.setopt(pycurl.MAXREDIRS,1) #最大重定向次数,0表示不重定向
  16.                                 c.setopt(pycurl.CONNECTTIMEOUT,60) #链接超时
  17.                                 c.setopt(pycurl.TIMEOUT,30)  #下载超时
  18.                                 c.setopt(pycurl.USERAGENT,'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)')
  19.                                 #pycurl.USERAGENT  模拟浏览器
  20.                                 c.setopt(pycurl.WRITEFUNCTION, b.write)  #回调写入字符串缓存
  21.                                 c.perform() #执行上述访问网址的操作
  22.                                 # print c.getinfo(pycurl.HTTP_CODE)
  23.                                 c.close()
  24.                                 html=b.getvalue()   #读取b中的数据
  25.                                 return html    #跳出并返回html
  26.                         except:
  27.                                 continue


  28. wurl=open(r"url1.csv",'a')

  29. caiji=caiji()

  30. class count:
  31.         def __init__(self):
  32.                 self.shoulu=0
  33.                 self.wshoulu=0
  34.                 self.i=0
  35.                 self.lock=threading.Lock()


  36.         def c_wshoulu(self):
  37.                 self.lock.acquire()
  38.                 self.wshoulu+=1
  39.                 wshoulu=self.wshoulu
  40.                 self.lock.release()
  41.                 return wshoulu


  42.         def c_sl(self):
  43.                 self.lock.acquire()
  44.                 self.shoulu+=1
  45.                 shoulu=self.shoulu
  46.                 self.lock.release()
  47.                 return shoulu


  48.         def c_i(self):
  49.                 self.lock.acquire()
  50.                 self.i+=1
  51.                 i=self.i
  52.                 self.lock.release()
  53.                 return i

  54. count=count()

  55. class th(threading.Thread):
  56.         def __init__(self,qurl):
  57.                 threading.Thread.__init__(self)
  58.                 self.qurl=qurl
  59.                 self.lock=threading.Lock()
  60.                 self.cond=threading.Condition()


  61.         def run(self):
  62.                 while 1:
  63.                         ddc=self.qurl.get()
  64.                         if ddc is  None:
  65.                                 break
  66.                         while 1:
  67.                                 bdhtm=caiji.html('http://www.baidu.com/s?wd='+ddc)
  68.                                 self.lock.acquire()

  69.                                 if '百度为您找到相关结果约' in bdhtm:
  70.                                         i=count.c_i()
  71.                                         print '第%s条, %s ,收录'% (i,ddc)
  72.                                         wurl.writelines('第%s条, %s ,收录\n'% (i,ddc))
  73.                                         count.c_sl()
  74.                                         break

  75.                                 elif '抱歉,没有找到与' in bdhtm:
  76.                                         i=count.c_i()
  77.                                         print '第%s条, %s ,未收录'% (i,ddc)
  78.                                         wurl.writelines('第%s条, %s ,未收录\n'% (i,ddc))
  79.                                         count.c_wshoulu()
  80.                                         break

  81.                                 elif 'http://verify.baidu.com/' in bdhtm:
  82.                                         print ddc,'出现验证码,等待5分钟后自动开始'
  83.                                         self.lock.release()
  84.                                         time.sleep(500)
  85.                                         continue

  86.                                 else:
  87.                                         print 'Error'
  88.                                         break
  89.                         self.lock.release()


  90. qurl=Queue.Queue(0)
  91. threadCount=6    #开启线程数,默认6个线程

  92. ths=[]
  93. for t in range(threadCount):
  94.         thread=th(qurl)
  95.         thread.start()
  96.         ths.append(thread)

  97. for ddc in open(r'url.csv'):   #导入需要查询的URL文件,格式必须是utf-8
  98.         ddc=ddc[0:-1]
  99.         qurl.put(ddc)

  100. for tt in range(threadCount):
  101.         qurl.put(None)

  102. for t in ths:
  103.         t.join()

  104. sl=count.c_sl()-1

  105. print  '\n收录率:'+str(round(float(sl)/float(count.c_i()-1)*100,2)),"%"
  106. print '收录:%s 条'%str(sl)
  107. print '未收录:%s 条'%str(count.c_wshoulu()-1)
复制代码
发表于 2014-8-20 11:33:54
回复 收藏
hwj888,友链。    

不知道快不快,之前那个不是很快。。等测试完在加分吧。。。。
发表于 2014-8-20 12:42:47
回复 收藏
vic,请到个人资料页面设置个人签名    [ 版主 ]

不错的代码   感谢
发表于 2014-8-20 13:28:25
回复 收藏
ZERO,SEO执着爱好者    

代码过多了些,粗看貌似是没把Queue用好。

如收录的URL计数,每次发现收录的,Queue put一条进去就行,最后计数。
发表于 2014-8-20 13:54:41
回复 收藏
莫山,改我论坛密码的没有小JJ,哼!!!    

hwj888 发表于 2014-8-20 12:42
不知道快不快,之前那个不是很快。。等测试完在加分吧。。。。

多线程的,怎么会慢,如果慢就是你网速问题,别太快,会 封ip的。
 楼主| 发表于 2014-8-20 13:55:22
回复 收藏
莫山,改我论坛密码的没有小JJ,哼!!!    

ZERO 发表于 2014-8-20 13:54
代码过多了些,粗看貌似是没把Queue用好。

如收录的URL计数,每次发现收录的,Queue put一条进去就行,最 ...

我只用Queue导入URL数据了,没做其他的。
 楼主| 发表于 2014-8-20 14:36:06
回复 收藏
思明,技术宅男SEO之路    QQ:176089710    

Queue 用于多线程的队列,还是挺好用的, 用来计数我也没用 Queue
这类工具 我习惯配合 Mongodb 存储 进度 和 中间结果  ,好处就是意外终止,可以接着运行下去,不用从头开始 ,浪费时间
发表于 2014-8-20 15:37:41
回复 收藏
506807274,请到个人资料页面设置个人签名    

支持,谢谢莫山分享
发表于 2015-8-20 14:28:08
回复 收藏
大苏,学习seo之路还很长    

好像,查的时候,未收录也被查成是收录的,不知道是不是我自身的原因
发表于 2015-8-24 10:37:07
回复 收藏
大苏,学习seo之路还很长    

未收录的,页面也包含 “百度为您找到相关结果约” ,这样也判断成收录的了
发表于 2015-8-24 10:44:16
回复 收藏
星鬼,来自大角星    

如果能增加收录的保存到yishoulu.txt,未收录的保存到weishoulu.txt这样分开保存下,就好了。
发表于 2015-9-25 16:29:51
回复 收藏
快速回复 返回顶部 返回列表