热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

urllib库的简单使用&&一个简单的Python爬虫示例

urllib库的简单使用&&一个简单的Python爬虫示例本篇文章,介绍urllib.request库的简单使用以及注意的问题。最后实现一个Python爬虫的示例。本文

urllib库的简单使用 && 一个简单的Python爬虫示例

本篇文章,介绍urllib.request库的简单使用以及注意的问题。最后实现一个Python爬虫的示例。

本文是基于Python3.6.2实现的。urllib.request相当于Python2.7中的urllib2的库的一部分。

urllib.request库的简单使用

  • urlopen():
# 请求一个百度地址,返回一个服务器响应的类文件对象response。
respOnse= urllib.request.urlopen('http://www.baidu.com/')

# 读取文件的内容
result = response.read()

# 打印result,输出的就是百度的网页源代码
print(result)

# 打印result的类型,结果是
print(type(result))

# 读取到文件,文件名baidu.html
with open('baidu.html','wb') as f:
f.write(result)

通过浏览器打开baidu.html文件,实际和浏览器输出http://www.baidu.com/结果是一样的。

  • 防止爬虫程序的ip被禁

其实上面的程序还不够好,因为我们直接通过urlopen(url)发送请求,实际上在http的请求头中有一个User-Agnet字段会标记为Python-urllib/3.6。如下面的httpheaders是通过fiddler抓包获取的。

GET http://www.baidu.com/ HTTP/1.1
Accept-Encoding: identity
Host: www.baidu.com
User-Agent: Python-urllib/3.6
Connection: close

浏览器访问的header信息如下:

GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36
...

我们通过爬虫程序访问的第三方服务器,服务器就能知道你是通过爬虫程序访问的。因为你的http的请求头信息User-Agent字段出卖了你。所以我们需要修改请求头的User-Agent字段信息,防止ip被禁。

# 定义一个url
url = 'http://www.baidu.com/'

# 定义一个请求头的User-Agent字段,User-Agent的内容可以通过fiddle抓取浏览器访问的url的header中的信息,模拟浏览器访问,也可以网上随便找一个
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}

# 自定义请求头信息,返回一个请求的对象request,Request()参数,还可以接收data参数,表示请求体
request = urllib.request.Request(url,headers = headers)

# 通过urlopen访问url,服务器返回response对象
respOnse= urllib.request.urlopen(request)

# 读取返回结果
result = response.read()

# 写入文件
with open('baidu.html','wb') as f:
f.write(result)
  • 获取返回响应的数据

当获取响应的response对象时,我们可以获取响应码,响应体等信息,如:

# 获取响应码
response.getcode()

# 获取请求的url
response.geturl()

# 获取响应头信息
response.info()
  • quote()unquote()

在url的get请求,url会有中文的问题,这时的中文需要转码成urlencode编码。我们需要通过quote()处理中文字符的问题。

# 将中文转成urlencode编码
result = urllib.request.quote('薛之谦')

# 输出,结果:%E8%96%9B%E4%B9%8B%E8%B0%A6
print(result)

# 将urlencode编码的数据,进行解码
result = urllib.request.unquote('%E8%96%9B%E4%B9%8B%E8%B0%A6')

# 输出,结果:薛之谦
print(result)

一个简单的Python爬虫示例

该爬虫爬取的网站是百度贴吧。具体入下:

创建一个tieba.py的文件,代码如下:

#!/usr/bin/env python
# encoding: utf-8

import urllib.request


def load_page(request):
"""
加载网络的页面信息
:param request: 请求参数
:return:返回服务端的响应信息
"""

return urllib.request.urlopen(request)


def write_page(response, filename):
"""
将响应返回的信息,写入文件保存
:param response:服务器返回的响应信息
:param filename:保存的文件名
:return:
"""

cOntent= response.read()
with open(filename, 'wb') as f:
f.write(content)


def spider(url, headers, startPage, endPage):
"""
爬取网页的方法
:param url: 请求的url
:param headers:自定义的请求头信息
:param startPage:请求的开始页面
:param endPage:请求的结束页面
:return:
"""

for page in range(startPage, endPage + 1):
page = (page - 1) * 50
# 通过研究页面的规律,拼接需要请求的完整url
fullUrl = url + '&pn=' + str(page)
print(fullUrl)
# 获取请求对象
request = urllib.request.Request(fullUrl, headers=headers)
# 加载页面,返回服务端的响应
respOnse= load_page(request)
# 拼接文件名
filename = '第' + str(int(page / 50 + 1)) + "页.html"
# 写入文件
write_page(response, filename)


if __name__ == '__main__':
# 百度贴吧的url
url = 'https://tieba.baidu.com/f?'
# 防止ip被禁,重新指定User-Agent字段信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'}
# 通过输入关键字查询
keyword = input('请输入关键字:')
# 输入的文字(如:中文)进行urlencode编码
keyword = urllib.request.quote(keyword)
# 拼接url
fullUrl = url + "kw=" + keyword
# 输入起始页
startPage = int(input("输入起始页:"))
# 输入结束页
endPage = int(input('输入结束页:'))
# 开始抓取页面
spider(fullUrl, headers, startPage, endPage)

运行tieba.py文件,在控制台会让你输入:请输入关键字:等。如图:

image


推荐阅读
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
author-avatar
我是刘平2010_327
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有