一、网络爬虫的定义
络爬虫,也叫网络蜘蛛(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下载图片的小例子
import urllib.request
#urlopen函数可以传入字符串
#response = urllib.request.urlopen("http://placekitten.com/g/500/600")
#也可以传入对象
req = urllib.request.Request("http://placekitten.com/g/500/600")
response = urllib.request.urlopen(req)
print(response.geturl())
print(response.info())
print(response.getcode())
cat_img = response.read()
with open('cat_500_600.jpg','wb') as f:
f.write(cat_img)
结果截图:
3.2模拟游览器向翻译网站(百度翻译)发送数据获得翻译结果
我这里使用的是chrome游览器来查看网页数据,通过preview来获知哪个文件是我们post的文件,做好基础工作;
我们观察Headers菜单下的文件
注意:这里的Form Data非常重要,这也是百度翻译和有道翻译最大的不同,因为有道翻译有更多的条目,包括对输入内容的签名
代码:
import urllib.request
import urllib.parse
import json
while True:
url= 'http://fanyi.baidu.com/v2transapi'
content = input("请输入需要翻译的内容:(输入q!退出程序)")
if content == "q!":
break
data = {}
data['from'] = 'zh'
data['to'] = 'en'
data['query'] = content
data['transtype']= 'realtime'
data['simple_means_flag'] = '3'
data = urllib.parse.urlencode(data).encode('utf-8')
req = urllib.request.Request(url,data)
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
#print(html)
re = json.loads(html)
#print(type(re))
print("翻译结果:%s" % (re['trans_result']['data'][0]['dst']))
结果截图:
另附上向有道翻译发送数据获取翻译内容的代码:
import urllib.request
import urllib.parse
import json
import time
while True:
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule&sessionFrom=https://www.baidu.com/link'
content = input("请输入需要翻译的内容:(输入q!退出程序)")
if content == "q!":
break
'''
head = {}
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'
'''
data = {}
data['i'] = content
data['from'] = 'AUTO'
data['to'] = 'AUTO'
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['smartresult']='dict'
data['client'] = 'fanyideskweb'
data['salt'] = '1501071007888'
data['sign']='57cea9f8d873365dad9d21f148e56ee2'
#data['action']='FY_BY_CL1CKBUTTON'
data['typoResult'] = 'true'
data = urllib.parse.urlencode(data).encode('utf-8')
'''
response = urllib.request.urlopen(url,data)
'''
req = urllib.request.Request(url,data)
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')
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
print(html)
re = json.loads(html)
print("翻译结果:%s" % (re["translateResult"][0][0]['tgt']))
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。