爬虫简介:
爬虫就是一段自助抓取互联网信息的程序
简单爬虫架构:
我们用一段简单的代码爬取百度网页:
但是上述爬取的结果只能给看得懂代码的程序员看,我们如何得到想要的图形化界面呢?
下面我们试着从网站上爬取一个图片
我们从网站http://placekitten.com上获取一张大小为500*600的图片
爬取结果:
response.geturl()可以获取链接地址
response.info() 返回一个对象,包含网页的头部信息
关于urllib包的用法可以查看官方文档
我们来查看有道翻译的页面信息
Form data中是post提交的主要内容:
服务器用Header中的User-Agent来识别是浏览器访问还是代码访问。如果是python爬虫访问则会被服务器注明,有些服务器可能会屏蔽代码的访问。
那么如何用python实现对表单的提交呢?
import urllib.request
import urllib.parse
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {}
data['i'] = '爱国'
data['from'] = 'AUTO'
data['to'] = 'AUTO'
data['smartresult'] = 'dict'
data['client']= 'fanyideskweb'
data['salt'] = '1522810548560'
data['sign'] = '1c3052fed220e88ca910ac44dedd91ea'
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['action'] = 'FY_BY_REALTIME'
data['typoResult'] = 'false'
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
print(html)
对于HTTP POST请求方法,数据应该是标准应用程序/ x-www-form-urlencoded格式的缓冲区。 urllib.parse.urlencode()函数接受2元组的映射或序列,并返回此格式的ASCII字符串。它应该被编码为字节,然后用作数据参数。
也就是说我们首先需要将表单数据以二元组序列存储起来,这里我们使用字典,然后使用urllib.parse.urlencode()函数将数据进行格式的转换,最后对数据进行编码。
在这里,简单的说一下decode和encode两个函数的作用:
decode 的作用是将其他编码的字符串转换成 Unicode 编码,
eg name.decode(“GB2312”),表示将GB2312编码的字符串name转换成Unicode编码
encode 的作用是将Unicode编码转换成其他编码的字符串,
eg name.encode(”GB2312“),表示将GB2312编码的字符串name转换成GB2312编码
Python中使用的编码是Unicode编码。
上述代码运行结果如下:
但是这样的结果也只能给程序员看了,用户可不知道你的运行结果是什么意思,这样的结果其实就是json的结构,我们可以使用json模块的loads方法解析出该字符串,实际上就是反序列化操作。经过反序列或操作之后我们便可以得到一个字典,然后一步步便可以提取出我们要的数据。
import json
import urllib.request
import urllib.parse
content = input('请输入需要翻译的内容:')
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {}
data['i'] = content
data['from'] = 'AUTO'
data['to'] = 'AUTO'
data['smartresult'] = 'dict'
data['client']= 'fanyideskweb'
data['salt'] = '1522810548560'
data['sign'] = '1c3052fed220e88ca910ac44dedd91ea'
data['doctype'] = 'json'
data['version'] = '2.1'
data['keyfrom'] = 'fanyi.web'
data['action'] = 'FY_BY_REALTIME'
data['typoResult'] = 'false'
data = urllib.parse.urlencode(data).encode('utf-8')
response = urllib.request.urlopen(url,data)
html = response.read().decode('utf-8')
#print(html)
target = json.loads(html)
print('翻译结果 %s' % (target['translateResult'][0][0]['tgt']))
结果如下: