今天想写一篇关于python爬虫的博文,正好这几天有几百个单词要翻译,而翻译软件我最常用的就是有道,去有道首页抓个包看一下,是http协议而且还是get请求这就好办了,使用时要注意是有道http://www.youdao.com/, 不是有道翻译,有道翻译采用的是post请求,这次我们使用有道首页,下面是我抓到的包分析的。
箭头里标注的就是获取到的,由于是get请求,很简单,不需要其他什么参数,只看content里的内容即可。下面开始写python程序,既然发现是http协议,那我自己有urllib2库去抓就好,我使用的是python2.7,IDE为pycharm,下面是代码,分两段函数,不喜欢把所有代码写到一起,写成函数使用的时候直接调用就行,不需要到处找,到处注释掉。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#-*- coding=utf8 -*- import urllib2 def get_html(url): #获取网页内容 result = urllib2.urlopen(url) return result.read() def save_file(text,filename): #保存到文件 f = open(filename, 'w') f.write(text) f.close() if __name__=='__main__': url = 'http://www.youdao.com/w/result/#keyfrom=dict2.top' save_file(get_html(url), 'thefile.txt') #将得到的网页直接存到文件里 |
然后到你这个执行的项目的文件夹下找thefile.txt这个文件,是执行的这个程序的文件夹里。打开可以看到果然获取了全部网页内容。
但是我想做的是一个翻译程序,需要获取具体的意思,这时候就要用到正则表达式来提取关键内容了,现在开始分析我们所需要的其实就是下面这个框里的内容
其实就在网页这里,包含在一个ul下面
.....写了一会完全提取不出来这对ul里的内容,网页里的ul太多,没有明显的特征,只好弃用正则表达式,用我的另外一个神器,BeautifulSoup库,简直就是万能的提取库。没有安装的可以去官网下载,安装方式参考我下面的这篇博文。
》》》这是官网下载地址
》》》强大的BeautifulSoup库
这是我提取出来的结果,直接就找到了,而且显示的还是中文,用正则表达式一般都会把中文给编码以后再显示,因为我们需要的ul是在第二个所,以提取出去全部内容以后直接显示第二个。
现在问题又来了,如何显示li里面的内容,我想用了正则表达式,但提取出来的是编码以后的中文,只能继续使用Beautifulsoup这个神器,具体研究的过程不再详细阐述,大家看代码就可以。这样代码基本完成,但是不方便使用啊,url是可以变得,于是我弄一个变量放进去,在给一个提示框,把每次要查的单词输入即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#-*- coding=utf8 -*- import urllib2 import re from bs4 import BeautifulSoup def get_html(url): #获取网页内容 result = urllib2.urlopen(url) return result.read() def save_file(text,filename): #保存到文件 f = open(filename, 'ab') f.write(text) f.close() def open_file(filename): #打开文件 f = open(filename,'r') text = f.read() f.close() return text def soup_html(text,word): # 使用beautifulsoup提取的函数 soup = BeautifulSoup(text) result = soup.find_all('ul') #这是第一次提取出来的ul结果,需要进行下一步提取 ul_list = str(result[1]) # beautifulsoup要求使用字符串类型,所以先转换一下 soup_ul = BeautifulSoup(ul_list) #建立第二个提取实例 for line in soup_ul.stripped_strings: #对获取到的ul里的内容进行提取 print line def manage(): #封装所有函数的main word = raw_input('请输入要翻译的单词.....') url = 'http://www.youdao.com/w/'+word+'/#keyfrom=dict2.top' soup_html(get_html(url),word) if __name__=='__main__': manage() |