一个爬虫的自我修养之使用urllib进行网页抓取

一、网络爬虫的定义

络爬虫,也叫网络蜘蛛(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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值