小白学的python爬虫课程——第一天

951 阅读3分钟

前言🌞

好久不见,甚是想念。我发现如今的游戏真是越来越好玩,视频真是越来越好看,最后恩是甩都甩不脱。

最近听说,python语言已经是github最受欢迎语言排行榜第二名。吓得我差点摔掉了我的魅族16th。立马打开看了一下,还好我大前端javascript还是第一名😉。

作为一名攻城师(搬砖二号),其实我认为2019年的python完全符合我们前端儿的气质。写点脚本,处理点表格,爬点小图片。嘿嘿嘿!简直是为了开发者量身定做的🗡。

所以我打算在这里记录下python爬虫学习路程。希望你能在看耍的同时,为我指点迷津,为我鼓励😘

1.urllib下载百度html文件

# urllib模块下载百度的html页面
import urllib.request

def load_baidu():
  url = "http://www.baidu.com"
  #请求网络数据
  response = urllib.request.urlopen(url)
  data = response.read().decode('utf-8')
  
  # 响应data写入文件
  with open("baidu.html","w") as f:
    f.write(data)

load_baidu()

如果你复制这段代码,那么你同目录文件下一定会多了一个baidu.html文件,👈赶紧看一看

如果你看到的结果和上图一致,那么恭喜你已经迈出了一大步,但是我们先不要太高兴。毕竟老话说了,步子迈得太大小心扯着🥚

所以我们应该去思考每一行代码干了什么,复制可不是一个优秀攻城师的风采哟💪

2.请求https协议

细心的小伙伴可能发现了,上面我们请求的是http协议下的baidu,而不是https

当我们使用https://www.baidu.com时可能会出现下面的报错问题

<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)>

说明我们的缺少ssl证书

现在我们把代码修改一下

# urllib模块配置headers,访问https协议的百度
import urllib.request
import ssl

# 创建未证实的ssl上下文
context = ssl._create_unverified_context()

def load_baidu():
  url = "https://www.baidu.com"


  #请求网络数据
  response = urllib.request.urlopen(request,context=context)
  data = response.read().decode('utf-8')
  
  with open("baidu.html","w") as f:
    f.write(data)
  # print(response.headers)

load_baidu()

3.新增请求头信息

请求成功,我们立刻打来baidu.html。咦?什么都没有!😨赶紧打开开发者工具查看baidu.html文件 代码如下:

<html>
<head>
	<script>
		location.replace(location.href.replace("https://","http://"));
	</script>
</head>
<body>
	<noscript><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></noscript>
</body>
</html>

造成这个原因是,baidu.html会对请求的用户(我)进行检测,由于我的request headers什么信息都没有,就不允许我使用https来访问,从而重定向到http

知道原因后,我们赶紧加上请求头吧!做一个有头有脸的爬虫。

# urllib模块配置headers,访问https协议的百度

import urllib.request
import ssl

# 创建未证实的ssl上下文
context = ssl._create_unverified_context()

def load_baidu():
  url = "https://www.baidu.com"
  header = {
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
  }
 #创建请求对象,方便后期新增 headers信息
  request = urllib.request.Request(url,headers=header)
  #请求网络数据
  response = urllib.request.urlopen(request,context=context)
  data = response.read().decode('utf-8')
  
  with open("baidu.html","w") as f:
    f.write(data)
  # print(response.headers)

load_baidu()

oh,✌。我们再次成功的拿到了百度的html文件。 总结一下,今天我们主要收获了哪些知识。

  • 使用urllib.request模块请求页面,并写入到我们的磁盘中
  • urllib模块使用ssl完成https的访问
  • 为request请求增加请求头(header)

是不是感觉才学一点点就结束了呢?哈哈哈,年轻人不能心急,一口吃不成大胖子除非吃的是猪饲料:)如果你是小白新手可以去熟悉下每行代码所使用到的api是什么?有哪些参数?每个参数又能干什么🤔?我相信你的功力必定与日俱增,今非昔比,让隔壁的小伙伴刮目相看。还在等什么?赶紧敲起来!

点个关注不迷路,后期会紧接着推送python爬虫学习教程,我们一同前行[奸笑] 奥力给😍