我写了一个爬乌云漏洞库的爬虫,其URL形式为http://www.wooyun.org/corps/公司名称/page/1,程序最后raw_input处输入公司名称即可跑出该公司的漏洞。现在的问题是中文编码的问题没解决好,如果公司的名称是英文如RiSing就可以,如果是中文就报错。求各位大大指点
# coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import urllib
import urllib2
import re
def getPage(pageNum):
try:
url = 'http://www.wooyun.org/corps/' + corpName + '/page/' + str(pageNum)
request = urllib2.Request(url)
response = urllib2.urlopen(request)
return response.read().decode('utf-8')
except urllib2.URLError, e:
if hasattr(e,u"reason"):
print u"error",e.reason
return None
def getContent(page):
pattern = re.compile('<tr>.*?<th><a href="#">(.*?)</a></th>.*?<td><a href="(.*?)">(.*?)</a></td>',re.S)
items = re.findall(pattern,page)
for item in items:
print item[0],'http://www.wooyun.org'+item[1],item[2]
def getPageNum(page):
pattern = re.compile('<p class="page">(.*?)<a',re.S)
items = re.findall(pattern,page)
text=items[0]
text=str(text)
m = re.findall('\d+',text)
PageNum=m[1]
return PageNum
def getResultNum(page):
pattern = re.compile('<p class="page">(.*?)<a',re.S)
items = re.findall(pattern,page)
text=items[0]
text=str(text)
m = re.findall('\d+',text)
ResultNum=m[0]
return ResultNum
def getAll():
page = getPage(1)
pageNum=getPageNum(page)
resultNum=getResultNum(page)
print u"查找到结果共" + str(pageNum) + u"页。"
for i in range(1, int(pageNum)+1):
print '==========================',u"正在写入第" + str(i) + u"页数据",'=========================='
page = getPage(i)
getContent(page)
print u"读取结束,共写入" + str(resultNum) + "条数据。"
corpName = raw_input("请输入公司的名字:".decode('utf-8').encode('gbk'))
getAll()
网址含中文要转义..
把14行换成
Ubuntu Gnome Terminal 已经测试(百度)成功
我觉得估计不是字符编码的问题,
URL
里怎么能直接出现汉字?你不要以为浏览器里显示:http://www.wooyun.org/corps/公司名称/page/1
你就觉得浏览器请求的URL
里面的公司名称
就真是汉字。事实上浏览器去请求的时候,
URL
里的汉字全都会用URLEncode
转一下的,真正的请求里没有汉字的。就像你请求:
http://www.wooyun.org/corps/阿里巴巴/page/1
,这是不会成功的。但你把URL写成:
http://www.wooyun.org/corps/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4/page/1
,你可以成功请求到阿里巴巴的页面。