Python爬虫 urllib请求对象的定制

先来补充点小知识:

什么是UA:

  用户代理(User Agent,简称 UA),是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

UA的获取:

        这里以谷歌浏览器为例,打开谷歌浏览器,F12打开检查框,依次点击图中红色标记处(如果发现信息不全就点击浏览器上的刷新按钮),最后黄线标记处就是你的浏览器的UA。

url的组成:

url的组成:

 https://www.baidu.com/s?wd=梅西

 http/https         www.baidu.com        80/443         s         wd=梅西      #   
    协议                 主机              端口号        路径         参数       锚点  

        我们先用以下代码来爬取百度首页的网页源代码,不过,我们在这里将百度网址中‘http’改成‘https’:

import urllib.request

url = 'https://www.baidu.com'   # http -> https

response = urllib.request.urlopen(url)

content = response.read().decode('utf-8')

print(content)

        最后控制台只能输出部分网页源代码。

        为什么同样的代码,当网址是‘http’时,能爬取所有数据,而当网址是‘https’时,却只能爬取部分数据呢?这是因为https相较于http,它具有安全性的ssl加密传输协议,因此在这里我们遇到了“反爬”,以至于我们无法成功爬取所有数据 。

        有一个方法是,利用UA来爬取数据。我们可以在urlopen方法中传入UA。那么如何传入UA到urlopen方法中呢?先来看下urlopen方法的源码:

        黄色标记处可知,urlopen第一个参数传入的类型应该是一个字符串或一个Request对象。

        因此,我们可以把我们的UA转换成Request对象来传入urlopen方法中。

        

        转换的过程,要用到请求对象的定制。初步代码如下(传参之前):

# 请求对象的定制
request = urllib.request.Request()

         我们来看看Request的源码,确定下传入参数的类型:

         可知,传入的是可以是一个url和一个headers字典,于是我们把UA存入字典中:

headers = {
    'User-Agent': '你获取的UA'
}

         最终,完整代码如下:

import urllib.request

url = 'https://www.baidu.com'

headers = {
    'User-Agent': '你获取的UA'
}

# 请求对象的定制
request = urllib.request.Request(url=url, headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')

print(content)

        运行成功后,就能爬取完整数据了。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值