全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

IP归属甄别会员请立即修改密码
楼主: flydon
打印 上一主题 下一主题

PYTHON 获取GB2312的问题

[复制链接]
11#
发表于 2015-12-3 09:31:08 | 只看该作者
HelloAoA 发表于 2015-12-3 09:28
pydev测试通过,原来写的……还有192.。。。这货还要自己搞……有些编码器不支持中文,还有bs4的能够直接 ...

我估计他是py文件保存格式没有选utf-8  他的py文件里出现中文了,就必须选择保存文件格式。
建议用notepad++写
12#
发表于 2015-12-3 09:34:14 | 只看该作者
HelloAoA 发表于 2015-12-3 09:28
pydev测试通过,原来写的……还有192.。。。这货还要自己搞……有些编码器不支持中文,还有bs4的能够直接 ...

同道中人啊。。。。笔趣阁。。。。。。


  1. #!coding=UTF-8
  2. #自动采集脚本,siteid=24 笔趣阁
  3. import urllib
  4. import urllib2
  5. import commands
  6. import time
  7. import threading
  8. import os
  9. import re
  10. import sys
  11. import subprocess
  12. import MySQLdb

  13. thlen = 30
  14. #定义同时采集的线程数
  15. books = []
  16. #定义需要采集的书库
  17. tsk = []
  18. #定义采集线程数组


  19. #定义数据库连接参数
  20. mysqlhost = 'localhost'
  21. mysqluser = 'jieqi'
  22. mysqlpass = 'jieqi123'
  23. mysqldb = 'jieqi'
  24. mysqlcharset = 'gbk'
  25. mysqlsocket = '/tmp/mysql.sock'

  26. #定义采集后台信息
  27. domain = 'cj.jieqixxx.com'
  28. adminuser = 'admin'
  29. adminpass = 'mypassword'
  30. siteid = '24'
  31. # notaddnew = '0'

  32. #定义来源站点信息
  33. fromcharset = 'gbk'
  34. frompages = [
  35. ['http://www.biquge.la/',30],
  36. ]
  37. #定义获取书号、书名、最新章节、作者的正则语句
  38. regstr = r'<span class="s2"><a href="/book/([0-9]+)/" target="_blank">([^<]+)</a></span><span class="s3"><a [^>]+>([^<]+)</a></span><span class="s4">([^<]+)</span>'


  39. def cth():  
  40.     print "启动空闲线程用以采集...成功"

  41. def addbooklist(page,sleeptime):
  42.     while 1:
  43.         try:
  44.             print '[' + time.strftime('%H:%M:%S')  + '] 采集更新列表线程启动。'
  45.             start = time.time()        
  46.             response = urllib2.urlopen(page, timeout = 12)
  47.             content = response.read().decode(fromcharset).encode('utf8')#转换采集内容编码为python页面编码
  48.             response.close()
  49.             elapsed = (time.time() - start)
  50.             bookattr = re.findall(regstr,content,re.M)
  51.             print '[' + time.strftime('%H:%M:%S')  + '] 采集更新列表结束,用时:' + str(elapsed) + '秒'
  52.             for ii in range(len(bookattr)):
  53.                 newbookid = bookattr[ii][0].strip().rstrip('.').decode('utf8')#content已经是页面编码(utf8)了,所以应该从utf-8转成unicode
  54.                 newbookname = bookattr[ii][1].strip().rstrip('.').decode('utf8')
  55.                 newbooklastchapter = bookattr[ii][2].strip().rstrip('.').decode('utf8')
  56.                 newbookauthor = bookattr[ii][3].strip().rstrip('.').decode('utf8')
  57.                 inlist = False
  58.                 for tt in range(len(books)):
  59.                     if (books[tt][0]==newbookid):
  60.                         inlist = True
  61.                         
  62.                 needcj = False #将是否需要采集设置为否
  63.                 reason = ''
  64.                 if inlist:#在待采集列表
  65.                     needcj = False #已经在待采集列表了
  66.                     reason = '该书已经在待采集列表了,不添加'
  67.                 else:#不在带采集列表
  68.                     conn=MySQLdb.connect(host=mysqlhost,user=mysqluser,passwd=mysqlpass,db=mysqldb,charset=mysqlcharset,unix_socket=mysqlsocket)
  69.                     cur=conn.cursor()
  70.                     count=cur.execute('select `lastchapter`,`setting` from `jieqi_article_article` where `articlename` REGEXP "^' + newbookname.encode(mysqlcharset) + '" and `author` REGEXP "^' + newbookauthor.encode(mysqlcharset) + '"')
  71.                     if count <=0:#本站没有该书
  72.                         needcj = True #需要采集
  73.                         reason = '本站无该书,加入待采集列表。'  
  74.                         cur.close()
  75.                         conn.close()
  76.                     else:#本站有该书(根据书名和作者判断)
  77.                         result = cur.fetchone()#从本站数据库获取该书的最新章节和来源站点ID以及来源书号
  78.                         cur.close()
  79.                         conn.close()
  80.                         lastchapter = result[0]
  81.                         setting = result[1]
  82.                         if ('a:' in setting):#该书有setting记录,进行比对                           
  83.                             fromsiteid = re.search('"fromsite";s:[0-9]+:"([^"]*)"',setting).group(1)
  84.                             fromarticleid = re.search('"fromarticle";s:[0-9]+:"([^"]*)"',setting).group(1)
  85.                             if (fromsiteid == siteid) and (fromarticleid == newbookid):#来源一致(来源站点id和来源书号判断)
  86.                                 if (newbooklastchapter in lastchapter):#最新章节一致,表示无更新,无需采集
  87.                                     needcj = False
  88.                                     reason = '来源一致,且最新章节一致,无更新,不加入。'
  89.                                 else:#最新章节不一致,表示有更新,需要采集
  90.                                     needcj = True
  91.                                     reason = '来源一致,且最新章节不一致,有更新,加入待采集列表。'
  92.                             else:#来源不一致
  93.                                 needcj = False#无需采集,避免章节出错
  94.                                 reason = '来源不一致,不加入。'   
  95.                         else:#该书上次采集未完成,没有setting记录
  96.                             needcj = True #需要采集
  97.                             reason = '该书上次采集未完成被中断,加入待采集列表。'                        
  98.                 if needcj:   
  99.                     books.append((newbookid.encode(mysqlcharset),newbookname.encode(mysqlcharset)))
  100.                 print '书号:' + newbookid.encode('utf8') + '  书名:' + newbookname.encode('utf8') + reason
  101.             print '[' + time.strftime('%H:%M:%S')  + '] 采集更新列表线程完成,线程休眠。'
  102.             time.sleep(sleeptime)
  103.         except:
  104.             info=sys.exc_info()  
  105.             print info[0],":",info[1]
  106.             continue


  107. def caiji(bookid,bookname):         
  108.     print '正在采集 书号[' + bookid.decode(mysqlcharset).encode('utf8') + '] 书名:' + bookname.decode(mysqlcharset).encode('utf8')   
  109.     url = 'http://'+ domain + '/modules/article/admin/batchcollect.php?action=bcollect&siteid=' + siteid + '&batchids=' + bookid + '&jieqi_username=' + adminuser + '&jieqi_userpassword=' + adminpass
  110.     start = time.time()
  111.     #page = urllib2.urlopen(url,timeout=3600)
  112.     #data = page.read(8192)
  113.     #while data:
  114.     #   data = page.read(8192)
  115.     #page.close()
  116.    
  117.     content = ''
  118.     p = subprocess.Popen('wget -qO - "' + url + '"', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  119.     for line in p.stdout.readlines():
  120.         content += line.decode('gbk').encode('utf8')
  121.     retval = p.wait()
  122.     reclean = re.search('<a href="([^"]+)">点击这里清空小说',content)
  123.     if reclean:
  124.         cleanlink = 'http://'+ domain + reclean.group(1) + '&jieqi_username=' + adminuser + '&jieqi_userpassword=' + adminpass
  125.         print '章节不对应,需要清空重采。'
  126.         content = ''
  127.         p = subprocess.Popen('wget -qO - "' + cleanlink + '"', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  128.         for line in p.stdout.readlines():
  129.             content += line.decode('gbk').encode('utf8')
  130.         retval = p.wait()
  131.         recj = re.search("url=([^']+)'>",content)
  132.         if recj:
  133.             cjlink = 'http://'+ domain + recj.group(1) + '&jieqi_username=' + adminuser + '&jieqi_userpassword=' + adminpass
  134.             print '清空成功,重采ing......'
  135.             content = ''
  136.             p = subprocess.Popen('wget -qO - "' + cjlink + '"', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  137.             for line in p.stdout.readlines():
  138.                 content += line.decode('gbk').encode('utf8')
  139.             retval = p.wait()
  140.    
  141.     elapsed = (time.time() - start)
  142.     time.sleep(5)
  143.     print '书号[' + bookid.decode(mysqlcharset).encode('utf8') + '] 书名:' + bookname.decode(mysqlcharset).encode('utf8') + '采集完成! 用时:' + str(elapsed) + '秒'



  144. #创建采集线程(空闲)
  145. for x in range(thlen):
  146.     tname = 't' + str(x)
  147.     th = threading.Thread(target=cth,name=tname)
  148.     th.start()#启动一个采集线程
  149.     tsk.append(th)
  150.    
  151. #启动书籍列表采集线程
  152. for pp in range(len(frompages)):
  153.     thaddbooklist = threading.Thread(target=addbooklist,name='taddbooklist',args=(frompages[pp][0],frompages[pp][1]))   
  154.     thaddbooklist.start()

  155. #检测采集用的空闲线程,当线程闲置时,若待采集列表不为空时,启用该线程进行采集
  156. while 1:
  157.     #try:
  158.         #线程名使用书号,检测线程空闲,获取线程名,即为上次采集的书号
  159.         time.sleep(8)
  160.         for i in range(len(tsk)):
  161.             if not tsk[i].is_alive():#线程空闲
  162.                 print 'T' + str(i) + '线程空闲,上次采集书号: ' + tsk[i].name
  163.                 for k in range(len(books)): #线程空闲,采集结束,从待采集列表删除采集完的书
  164.                     if books[k][0] == tsk[i].name:
  165.                         del books[k]#根据索引删除
  166.                         break#删除后记得跳出循环,不然下标要超
  167.                         #根据内容删除books.remove(book)  

  168.                 for k in range(len(books)):#循环查找没有在采集的书号
  169.                     if len(books[k]) == 2:#元素个数等于2 说明该书没有在采集(bookid,bookname)
  170.                         bookid = books[k][0]
  171.                         bookname = books[k][1]
  172.                         th = threading.Thread(target=caiji,name=bookid,args=(bookid,bookname))
  173.                         th.start()
  174.                         books[k] = books[k] + ("1",)#将待采集列表中的该书Tuple增加一个元素,来判断是否在采集中
  175.                         tsk[i] = th
  176.                         break;#启动线程后必须退出该循环
  177.     #except:
  178.     #    continue
  179.         
复制代码

13#
发表于 2015-12-3 09:38:40 | 只看该作者
看到评论后,原来大牛这么多,让那些黄牛情何以堪!
14#
发表于 2015-12-3 09:42:25 | 只看该作者
jsenet 发表于 2015-12-3 09:34
同道中人啊。。。。笔趣阁。。。。。。

棒棒棒,收了~
15#
 楼主| 发表于 2015-12-3 09:44:51 | 只看该作者
HelloAoA 发表于 2015-12-3 09:28
pydev测试通过,原来写的……还有192.。。。这货还要自己搞……有些编码器不支持中文,还有bs4的能够直接 ...

你这个是GBK和GB2312差别略大把。另外BS没4只有3,PY2不支持4.
16#
 楼主| 发表于 2015-12-3 09:47:29 | 只看该作者
jsenet 发表于 2015-12-3 09:19
1.你的ssh (putty)是否选择了utf-8
2.该py保存文件格式是否选了utf-8

我不是用ssh跑的,我直接是用CMD跑的。另外。文件是用pycharm保存的,全程使用的是UTF8
17#
发表于 2015-12-3 09:48:30 | 只看该作者
flydon 发表于 2015-12-3 09:47
我不是用ssh跑的,我直接是用CMD跑的。另外。文件是用pycharm保存的,全程使用的是UTF8 ...

我测试下。。。url就换笔趣阁吧  也是gbk的
18#
发表于 2015-12-3 09:49:33 | 只看该作者
flydon 发表于 2015-12-3 09:47
我不是用ssh跑的,我直接是用CMD跑的。另外。文件是用pycharm保存的,全程使用的是UTF8 ...

直接在pycharm里跑啊,cmd不支持utf-8,编码转来转去就搞不清楚了,或者你右键Edit with IDLE,然后F5也可以。
19#
 楼主| 发表于 2015-12-3 09:52:23 | 只看该作者
pathletboy 发表于 2015-12-3 09:49
直接在pycharm里跑啊,cmd不支持utf-8,编码转来转去就搞不清楚了,或者你右键Edit with IDLE,然后F5也 ...

- -pycharm也是调用的CMD好伐。。。
20#
发表于 2015-12-3 09:54:20 | 只看该作者
flydon 发表于 2015-12-3 09:52
- -pycharm也是调用的CMD好伐。。。

不一样的,相信我。你试试utf-8输出,你就知道了,CMD不支持utf-8的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2025-9-28 04:18 , Processed in 0.229056 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表