网络爬虫urllib:request之urlopen

网络爬虫简介
  • 定义:按照一定规则,自动抓取万维网信息的程序或脚本。

  • 两大特征:

    • 能按程序员要求下载数据或者内容
    • 能自动在网络上流窜(从一个网页跳转到另一个网页)
  • 两大步骤

    • 下载网页
    • 提取正确的信息
    • 根据一定规则自动跳转其它撤销负面上执行以上两步操作
  • 爬虫分类

    • 通用爬虫(常见的搜索引擎)
    • 专用爬虫(聚集爬虫)
  • Python常用的网络包

    • Python3:urllib、requests

urllib

  • 包含的模块

    • urllib.request:打开和读取urls
    • urllib.error:包含urllib.request产生的常见的错误,使用try捕捉
    • urllib.parse:包含解析url的方法
    • urllib.robotparse:解析robots.txt文件
  • 这个模块的作用:

    • 第一个模块 request,它是最基本的 HTTP 请求模块,我们可以用它来模拟发送一请求,就像在浏览器里输入网址然后敲击回车一样,只需要给库方法传入 URL 还有额外的参数,就可以模拟实现这个过程了。
    • 第二个 error 模块即异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作保证程序不会意外终止。
    • 第三个 parse 模块是一个工具模块,提供了许多 URL 处理方法,比如拆分、解析、合并等等的方法。
    • 第四个模块是 robotparser,主要是用来识别网站的 robots.txt 文件,然后判断哪些网站可以爬,哪些网站不可以爬的,其实用的比较少。

request模块

request.urlopen(url)

  • geturl():返回结果的url
  • info():请求返回对象的meta信息,即网页的元信息,相当于HTTP的头信息
  • getcode():返回http code,如:404,202等信息

打开网页,并把相应页面作为返回结果。然后可以使用read()读取网页内容。

注: 打开的网页是bytes类型的,需要使用decode("utf - 8")解码,参数为解码的格式。同时也可以安装chardet模块,它可以自动检测页面的编码格式,当然,不一定准确。

chardet的使用格式:

cs = chardet.detect(html) # 得到字典
decode(cs.get("encoding", "utf - 8")) # 自动检测编码格式并解码,如果检测不到,以默认设置解码

举例:

使用urllib包中的request模块的方法request.urlopen()打开前程无忧网的任意页面,然后将其结果打印出来。

# 导入urllib包,并引用request模块
from urllib import request # 使用urllib.request请求一个网页内容,把内容打印出来 if __name__ == '__main__':
# 首先定义好需要访问的网站网页
url = "https://search.51job.com/list/060000%252C00,000000,0000,00,9,99,Python,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=" # 然后使用request.urlopen打开相应url并把相应页面作为返回
rsp = request.urlopen(url) #把返回结果读取出来
# 读取出来的内容的类型为bytes字节
html = rsp.read() # 由于该网页的编码格式为“gbk”,所以解码时也使用该格式
html = html.decode("gbk") print(html)

结果:打印出形如以下的结果

<!DOCTYPE html>
<html>
<head>
<meta>
<title></title>
</head>
<body> <script> </script>
</body>
</html>

特点注意: 使用urlopen()打开的网页结果返回是的tybes类型,需要使用encode()并指定编码格式解码出来才能打印出正确的结果。

当然,在使用encode()时,每次都需要修改格式,是否有些麻烦,在这里使用chardet模块就是一个不错的选择,程序会自动检测网页的编码格式,然后以相应的编码格式打印网页。

例: 使用chardet模块检测网页编码格式

import chardet

...

html = request.urlopen(url)

# 使用chardet生成编码字典
cs = chardet.detect(html) # 自动检测网页编码格式,然后以相应编码格式解码出来,如果没有检测到,使用默认设置格式
# 使用get取值的目的是保证不出错
html = html.decode(cs.get("encoding", "utf - 8"))
print(html)

结果还是一样的。

注意, 使用chardet.detect()生成编码格式字典,然后使用get()可以自动检测网页,其中,get()的参数表示默认格式,如果字典中没有检测出网页的格式,就以其默认设置的格式解码网页。

geturl、info、getocode的使用

使用这三个方法,分别可以得到网页的url,meta信息和http code。

还是以先前的例子为例。

# 导入urllib包,并引用request模块
from urllib import request # 使用urllib.request请求一个网页内容,把内容打印出来 if __name__ == '__main__':
# 首先定义好需要访问的网站网页
url = "https://search.51job.com/list/060000%252C00,000000,0000,00,9,99,Python,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=" # 然后使用request.urlopen打开相应url并把相应页面作为返回
rsp = request.urlopen(url) # 返回结果网页的url
print("URL: {0}".format(rsp.geturl())) # 得到网页的元信息,相当于HTTP头部信息
print("Info: {0}".format(rsp.info())) # http code
print("Code: {0}".format(rsp.getcode()))

结果:

URL: https://search.51job.com/list/060000%252C00,000000,0000,00,9,99,Python,2,1.html?lang=c&stype=1&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=
Info: Date: Mon, 08 Jul 2019 10:12:44 GMT
Server: Apache
Set-Cookie: guid=61af6f9db92ec772d5fe3a15809819b2; expires=Wed, 07-Jul-2021 10:12:44 GMT; path=/; domain=.51job.com; httponly
Set-Cookie: search=jobarea%7E%60060000%7C%21; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
Set-Cookie: nsearch=jobarea%3D%26%7C%26ord_field%3D%26%7C%26recentSearch0%3D%26%7C%26recentSearch1%3D%26%7C%26recentSearch2%3D%26%7C%26recentSearch3%3D%26%7C%26recentSearch4%3D%26%7C%26collapse_expansion%3D; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
Set-Cookie: search=jobarea%7E%60060000%7C%21ord_field%7E%600%7C%21; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
Set-Cookie: nsearch=jobarea%3D%26%7C%26ord_field%3D%26%7C%26recentSearch0%3D%26%7C%26recentSearch1%3D%26%7C%26recentSearch2%3D%26%7C%26recentSearch3%3D%26%7C%26recentSearch4%3D%26%7C%26collapse_expansion%3D; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
Set-Cookie: search=jobarea%7E%60060000%7C%21ord_field%7E%600%7C%21recentSearch0%7E%601%A1%FB%A1%FA060000%2C00%A1%FB%A1%FA000000%A1%FB%A1%FA0000%A1%FB%A1%FA00%A1%FB%A1%FA9%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FA99%A1%FB%A1%FAPython%A1%FB%A1%FA2%A1%FB%A1%FA%A1%FB%A1%FA-1%A1%FB%A1%FA1562580764%A1%FB%A1%FA0%A1%FB%A1%FA%A1%FB%A1%FA%7C%21; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
Set-Cookie: nsearch=jobarea%3D%26%7C%26ord_field%3D%26%7C%26recentSearch0%3D%26%7C%26recentSearch1%3D%26%7C%26recentSearch2%3D%26%7C%26recentSearch3%3D%26%7C%26recentSearch4%3D%26%7C%26collapse_expansion%3D; expires=Tue, 07-Jul-2020 10:12:44 GMT; path=/; domain=.51job.com; httponly
Keep-Alive: timeout=10, max=113
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html Code: 200

其中,meta信息相当于http头部信息,包括:日期、Cotent-Type等。

 
 

网络爬虫urllib:request之urlopen的更多相关文章

  1. from urllib.request import urlopen

    from urllib.request impor urlopen      (负责打开浏览url内的html 文本) re.compile(r'alex(?P<name>\d+)and' ...

  2. python实战——网络爬虫之request

    Urllib库是python中的一个功能强大的,用于操做URL,并在做爬虫的时候经常要用到的库,在python2中,分为Urllib和Urllib2两个库,在python3之后就将两个库合并到Urll ...

  3. 爬虫——urllib.request库的基本使用

    所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地.在Python中有很多库可以用来抓取网页,我们先学习urllib.request.(在python2.x中为urllib2 ...

  4. 爬虫——urllib.request包

    一.引用包 import urllib.request 二.常用方法 (1)urllib.request.urlretrieve(网址,本地文件存储地址):直接下载网页到本地 urllib.reque ...

  5. [Python3网络爬虫开发实战] 3.1.4-分析Robots协议

    利用urllib的robotparser模块,我们可以实现网站Robots协议的分析.本节中,我们来简单了解一下该模块的用法. 1. Robots协议 Robots协议也称作爬虫协议.机器人协议,它的 ...

  6. python爬虫 urllib模块url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

  7. 2.03_01_Python网络爬虫urllib2库

    一:urllib2库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中抓取出来.在Python中有很多库可以用来抓取网页,我们先学习urllib2. urllib2 是 Python ...

  8. 吴裕雄--天生自然python学习笔记:编写网络爬虫代码获取指定网站的图片

    我们经常会在网上搜索井下载图片,然而一张一张地下载就太麻烦了,本案例 就是通过网络爬虫技术, 一次性下载该网站所有的图片并保存 . 网站图片下载并保存 将指定网站的 .jpg 和 .png 格式的图片 ...

  9. Python网络爬虫练习

    1. 豆瓣top250电影 1.1 查看网页 目标网址:https://movie.douban.com/top250?start=0&filter= start=后面的数字从0,25,50一 ...

随机推荐

  1. ubuntu16搭建LAMP环境

    准备工作: 安装ubuntu16虚拟机,可以正常访问网络 更新为国内源(下载快一些) 1.安装apache sudo apt-get install apache2 然后打开我们的浏览器,访问一下 1 ...

  2. Ubuntu armhf 版本国内源

    Ubuntu armhf 版本国内源: deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted u ...

  3. 【开200数组解决二叉搜索树的建立、遍历】PAT-L3-016. 二叉搜索树的结构——不用链表来搞定二叉搜索树

    L3-016. 二叉搜索树的结构 二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它 ...

  4. 使用poi导出固定excel的模板,出现汉字不能自动设置行宽

    因为在工作中,可能因为不同的原因遇到不同的问题,本人就分享遇到的一个大坑 因为我要将数据库中的一部分字段的名称作为Excel中的列名,所以需要导出汉字,然后在对应的汉字下面填充数据. 正是因为这部分汉 ...

  5. Markdown编辑器的使用测试

    北京高校(大标题) 北京电子科技学院(小标题) 计算机技术(一级标) 研究生(二级标) 列表(三级标) 姓名 - 扎西 - 卓玛 学号 - 01 - 02 超链接 [QQ邮箱](https://www ...

  6. python_面向对象——反射

    1.反射 四个方法:getattr() 获取 class Person(): def __init__(self,name,age): self.name = name self.age = age ...

  7. 数据库概念 MySQL语法

    数据库概念 将保存的数据部分,存到一个公共的地方,所有的用户涉及到数据相关都必须来这个公共地方查找 MySQL 本质就是一款基于网络通信的应用软件,任何基于网络通信的软件底层都是socket 可以把M ...

  8. java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Workbook] with root cause

    一.问题描述 使用POI上传excel,本地可正常运行,开发服务器上报错. 二.异常信息如下: 2019-05-05 17:00:22,349 ERROR [http-nio-8080-exec-7] ...

  9. MongoDB 如何使用内存?为什么内存满了?

    最近接到多个MongoDB内存方面的线上case及社区问题咨询,主要集中在: 为什么我的 MongoDB 使用了 XX GB 内存? 一个机器上部署多个 Mongod 实例/进程,WiredTiger ...

  10. Elasticsearch 调优之 shrink

    对于索引分片数量,我们一般在模板中统一定义,在数据规模比较大的集群中,索引分片数一般也大一些,在我的集群中设置为 24.但是,并不是所有的索引数据量都很大,这些小数据量的索引也同样有较大的分片数.在 ...