今天想写一篇关于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 -*-
importurllib2
defget_html(url):#获取网页内容
result=urllib2.urlopen(url)
returnresult.read()
defsave_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库,简直就是万能的提取库。没有安装的可以去官网下载,安装方式参考我下面的这篇博文。
这是我提取出来的结果,直接就找到了,而且显示的还是中文,用正则表达式一般都会把中文给编码以后再显示,因为我们需要的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 -*-
importurllib2
importre
frombs4importBeautifulSoup
defget_html(url):#获取网页内容
result=urllib2.urlopen(url)
returnresult.read()
defsave_file(text,filename):#保存到文件
f=open(filename,'ab')
f.write(text)
f.close()
defopen_file(filename):#打开文件
f=open(filename,'r')
text=f.read()
f.close()
returntext
defsoup_html(text,word):# 使用beautifulsoup提取的函数
soup=BeautifulSoup(text)
result=soup.find_all('ul')#这是第一次提取出来的ul结果,需要进行下一步提取
ul_list=str(result[1])# beautifulsoup要求使用字符串类型,所以先转换一下
soup_ul=BeautifulSoup(ul_list)#建立第二个提取实例
forlineinsoup_ul.stripped_strings:#对获取到的ul里的内容进行提取
printline
defmanage():#封装所有函数的main
word=raw_input('请输入要翻译的单词.....')
url='http://www.youdao.com/w/'+word+'/#keyfrom=dict2.top'
soup_html(get_html(url),word)
if__name__=='__main__':
manage()
最后,这次的爬取比较简单,是http和get请求,没有参数和头部什么的要写,只是简单的爬取内容,然后再去分析提取,有兴趣的可以继续研究,这个可以用于大量单词的查找,代码是没有问题的,如果有疑问可与我联系。