您现在的位置是:Docker > Python运维 > Python urllib进行网页抓取

Python urllib进行网页抓取

时间:2018-05-15 15:47  来源:未知  阅读次数: 复制分享 我要评论

一、网络爬虫的定义

络爬虫,也叫网络蜘蛛(Web Spider),如果把互联网比喻成一个蜘蛛网,Spider就是一只在网上爬来爬去的蜘蛛。网络爬虫就是根据网页的地址来寻找网页的,也就是URL。举一个简单的例子,我们在浏览器的地址栏中输入的字符串就是URL,例如:https://www.baidu.com/


    RL就是统一资源定位符(Uniform Resource Locator),它的一般格式如下图:

二、urllib组件

在Python3.x中,我们可以使用urlib这个组件抓取网页,urllib是一个URL处理包,这个包中集合了一些处理URL的模块,如下:

 

urllib.request模块是用来打开和读取URLs的;

urllib.error模块包含一些有urllib.request产生的错误,可以使用try进行捕捉处理;

urllib.parse模块包含了一些解析URLs的方法;

urllib.robotparser模块用来解析robots.txt文本文件.它提供了一个单独的RobotFileParser类,通过该类提供的can_fetch()方法测试爬虫是否可以下载一个页面。

    我们使用urllib.request.urlopen()这个接口函数就可以很轻松的打开一个网站,读取并打印信息。


注意:

这个urlopen()函数的参数既可以是字符串也可以是对象。

三、两个小例子

3.1下载图片的小例子

[python] view plain copy
  1. import urllib.request  
  2. #urlopen函数可以传入字符串  
  3. #response = urllib.request.urlopen("http://placekitten.com/g/500/600")  
  4. #也可以传入对象  
  5. req = urllib.request.Request("http://placekitten.com/g/500/600")  
  6.   
  7. response = urllib.request.urlopen(req)  
  8. print(response.geturl())  
  9. print(response.info())  
  10. print(response.getcode())  
  11. cat_img = response.read()  
  12.   
  13. with open('cat_500_600.jpg','wb') as f:  
  14.     f.write(cat_img)  

结果截图:

 

3.2模拟游览器向翻译网站(百度翻译)发送数据获得翻译结果

我这里使用的是chrome游览器来查看网页数据,通过preview来获知哪个文件是我们post的文件,做好基础工作;

 

我们观察Headers菜单下的文件

注意:这里的Form Data非常重要,这也是百度翻译和有道翻译最大的不同,因为有道翻译有更多的条目,包括对输入内容的签名

代码:

[python] view plain copy
  1. import urllib.request  
  2. import urllib.parse  
  3. import json  
  4.   
  5. while True:  
  6.     url= 'http://fanyi.baidu.com/v2transapi'  
  7.     content = input("请输入需要翻译的内容:(输入q!退出程序)")  
  8.   
  9.     if content == "q!":  
  10.         break  
  11.   
  12.     data = {}  
  13.     data['from'] = 'zh'  
  14.     data['to'] = 'en'  
  15.     data['query'] = content  
  16.     data['transtype']= 'realtime'  
  17.     data['simple_means_flag'] = '3'  
  18.   
  19.     data = urllib.parse.urlencode(data).encode('utf-8')  
  20.   
  21.     req = urllib.request.Request(url,data)  
  22.   
  23.     response = urllib.request.urlopen(req)  
  24.     html = response.read().decode('utf-8')  
  25.     #print(html)  
  26.     re = json.loads(html)  
  27.     #print(type(re))  
  28.     print("翻译结果:%s" % (re['trans_result']['data'][0]['dst']))  

结果截图:

另附上向有道翻译发送数据获取翻译内容的代码:

[python] view plain copy
  1. import urllib.request  
  2. import urllib.parse  
  3. import json  
  4. import time  
  5.   
  6. while True:  
  7.     url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule&sessionFrom=https://www.baidu.com/link'  
  8.     content = input("请输入需要翻译的内容:(输入q!退出程序)")  
  9.     if content == "q!":  
  10.         break  
  11.     ''''' 
  12.     head = {} 
  13.     head['User-Agent'] =  'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36' 
  14.     '''  
  15.   
  16.     data = {}  
  17.     data['i'] = content  
  18.     data['from'] = 'AUTO'  
  19.     data['to'] = 'AUTO'  
  20.     data['doctype'] = 'json'  
  21.     data['version'] = '2.1'  
  22.     data['keyfrom'] = 'fanyi.web'  
  23.     data['smartresult']='dict'  
  24.     data['client'] = 'fanyideskweb'  
  25.     data['salt'] = '1501071007888'  
  26.     data['sign']='57cea9f8d873365dad9d21f148e56ee2'  
  27.     #data['action']='FY_BY_CL1CKBUTTON'  
  28.     data['typoResult'] = 'true'  
  29.     data = urllib.parse.urlencode(data).encode('utf-8')  
  30.     ''''' 
  31.     response = urllib.request.urlopen(url,data) 
  32.     '''  
  33.     req = urllib.request.Request(url,data)  
  34.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36')  
  35.   
  36.     response = urllib.request.urlopen(req)  
  37.     html = response.read().decode('utf-8')  
  38.     print(html)  
  39.     re = json.loads(html)  
  40.     print("翻译结果:%s" % (re["translateResult"][0][0]['tgt']))  
  41.     time.sleep(5)  

需要做几点说明:

1.因为有道翻译有 data['sign']='57cea9f8d873365dad9d21f148e56ee2'属性导致程序的灵活性受限(需要对输入内容进行签名),只能翻译特定内容.

2.data should be a buffer in the standard application/x-www-form-urlencoded format. The urllib.parse.urlencode() function takes a mapping or sequence of 2-tuples and returns a string in this format.(data必须是application/x-www-form-urlencoded 格式,所以要用urllib.parse.urlencode()函数对其进行编码

3.因为服务器可以通过User-Agent知道访问服务器的是程序而非人为操作的访问,所以我们可以人为配置User-Agent。

相关资讯