python爬虫urllib使用和进阶 | Python爬虫实战二

简介: 其实爬虫就是浏览器,只不过它是一个特殊的浏览器。爬取网页就是通过HTTP协议访问相应的网页,不过通过浏览器访问往往是人的行为,把这种行为变成使用程序来访问就是爬虫的过程。

查看上一节:python爬虫分类和robots协议

python爬虫urllib使用和进阶

上节课已经介绍了爬虫的基本概念和基础内容,接下来就要开始内容的爬取了。

其实爬虫就是浏览器,只不过它是一个特殊的浏览器。爬取网页就是通过HTTP协议访问相应的网页,不过通过浏览器访问往往是人的行为,把这种行为变成使用程序来访问就是爬虫的过程。

用户在使用浏览器的时候,翻阅速度是比较慢的,但是爬虫在访问的时候速度是很快的,它会很快的获取到页面上的内容,并将其变成自己网站的内容,所以对于开发者来讲,对于这些搜索引擎的爬虫是又爱又恨的。

有的网站会设置反爬虫策略来拒绝爬虫对网站内容的爬取要求。此时我们要爬取这种网站的话,是要对程序进行包装的,尽量去模拟人的行为来获取网站内容。

urllib包

urllib是Python提供的一个工具包,用来处理url和相应的一些内容的。

Python 2中提供了urllib和urllib 2。urllib提供较为底层的接口, urllib2对urllib进行了进一步封装。
Python 3中将urllib合并到了urllib 2中, 并只提供了标准库urllib包。我们重点使用的是Python3,但是它们的接口都是相同的,掌握了就可以在任何场景使用。

urllib还有一些子包,分别介绍下:

urllib.request模块(用的比较多)

用于打开和读写url。模块定义了在基本和摘要式身份验证、重定向、cookies等应用中打开URL(主要是HTTP)的函数和类。

  • urllib.error 包含了由urllib.request引起的异常
  • urllib.parse 用于解析url
  • urllib.robot parser 分析robots.txt文件

urlopen方法

格式:url open(url, data=None)
注释:url是链接地址字符串, 或请求对象。
data是提交的数据, 如果data为None发起GET请求, 否则发起POST请求。见urllib.request.Request#get_method返回http.client.HTTPResponse类的响应对象, 这是一个类文件对象。
接下来看一段代码:
image.png
验证其中的“返回真正的URL”:打开http://www.bing.com 按下F12 打开其中的Network状态栏,点击刷新:
image.png
可以看到第一个访问的是必应网站,这里的301代表的意思是,首先打开必应的网站,然后通过持久的移动到中国的必应网站;
这里的location是跳转位置,301代表永久的跳转,302 代表的是临时的跳转;
代码运行结果:
image.png
可以发现,urlopen是可以自动跳转的。
总结:
上例, 通过urllib.request.url open方法, 发起一个HTTP的GET请求, WEB服务器返回了网页内容。响应的数据被封装到类文件对象中, 可以通过read方法、readline方法、read lines方法获取数据, status和reason属性表示返回的状态码, info方法返回头信息, 等等。
User-Agent问题
上例的代码非常精简, 即可以获得网站的响应数据。url open方法只能传递url和data这样的数据, 不能构造HTTP的请求。例如useragent。
源码中构造的useragent如下:
image.png
当前显示为:Python-urllib/3.6
有些网站是反爬虫的,所以要把爬虫伪装成浏览器。随便打开一个浏览器,复制浏览器的UA值,进行伪装。
UA值获取方法:
打开浏览器的设置。选择高级,选择自定义UserAgent字符串,随意切换想要的UA值。
image.png
这里演示的是使用Chrome的ua值:
image.png
通过UA值的伪装,就可以告诉别人,“我是一个浏览器”,那么UA值该如何使用呢?这里就要用到request类:

Request类
首先它会有一个header,在这里记录了一些基本的信息:
image.png
还要有一个User-agent,这里是一些版本的要求,以及对能接受的浏览器版本、CSS样式等信息的描述:
image.png
有了以上两个参数,就可以构建一个request请求了。

接下来就是对request的使用实战演示:
image.png
运行结果为:
image.png
总结:
格式:Request(url, data=None, headers=() )
要在发起请求之前将内容填充完毕!

初始化方法, 构造一个请求对象。可添加一个header的字典。data参数决定是GET还是POST请求。add_header(key, val) 为header中增加一个键值对。

接下来看一个示例:

from urllib.request import Request, url open
import random#随机函数,用来随机UA值
#打开一个url返回一个Request请求对象
#url='https://movie.douban.com/'#注意尾部的斜杠一定要有
url='http://www.bing.com/'
ua_list=[#包含UA值的List,不停地切换地址,保证不被发现是爬虫
    ”Mozilla/5.0(WindowsNT I 6.1; Win 64; x 64) Apple WebKit/537.36(KHTML, like Gecko)Chrome /57.0.2987. 133 Safari/537.36”, #chrome
    ”Mozilla/5.0(Windows; U; WindowsNT 6.1; zh-CN) Apple webKit/537.36(KHTML, like Gecko)Version /5.0. 1 Safari/537.36”, #safa fi
    ”Mozilla/5.0(WindowsNT 6.1; Win 64; x 64; rv:50. 0) Gecko/ 20100101 Firefox/50.0”, #Firefox“Mozilla/5.0(compatible; MSIE 9.0; WindowsNT 6.1; Trident/5.0) ”#IE
ua=random.choice(ua_list) #随机一个UA值
#ua需要加到请求头中
request=Request(url)
request.add_header('User-Agent', random.choice(ua_list) )
print(type(request) )
response=url open(request, timeout=20) #request对象或者url都可以
print(type(response) )

with response:
    print(1, response.status, response.get code() , response.reason)#状态, get code本质上就是返回
status
    print(2, response.geturl() )#返回数据的url。如果重定向, 这个url和原始url不一样
    # 例如原始url是http://www.bing.com/, 返回http://cn.bing.com/
    print(3, response.info() )#返回响应头headers
    print(4, response.read() )#读取返回的内容

print(5, request.get_header('User-agent') )
print(6,'user-agent'.capitalize() )

执行结果为:
image.png
到这里就完成了对User-agent的修改,同时也学会了request和urlopen的使用方式。

上述的简单代码是学习爬虫的第一步,就算以后在开发中会用到框架,但是还是从基本内容出发的,希望同学们可以多加了解!

点击查看配套视频课程

获取更多内容,请订阅 Python学习站 官方技术圈!

相关文章
|
10天前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
11天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
12天前
|
数据采集 Web App开发 监控
高效爬取B站评论:Python爬虫的最佳实践
高效爬取B站评论:Python爬虫的最佳实践
|
10天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
12天前
|
数据库 Python
异步编程不再难!Python asyncio库实战,让你的代码流畅如丝!
在编程中,随着应用复杂度的提升,对并发和异步处理的需求日益增长。Python的asyncio库通过async和await关键字,简化了异步编程,使其变得流畅高效。本文将通过实战示例,介绍异步编程的基本概念、如何使用asyncio编写异步代码以及处理多个异步任务的方法,帮助你掌握异步编程技巧,提高代码性能。
48 4
|
11天前
|
机器学习/深度学习 数据可视化 数据处理
Python数据科学:从基础到实战
Python数据科学:从基础到实战
20 1
|
12天前
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
32 1
|
13天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
15天前
|
前端开发 API 开发者
Python Web开发者必看!AJAX、Fetch API实战技巧,让前后端交互如丝般顺滑!
在Web开发中,前后端的高效交互是提升用户体验的关键。本文通过一个基于Flask框架的博客系统实战案例,详细介绍了如何使用AJAX和Fetch API实现不刷新页面查看评论的功能。从后端路由设置到前端请求处理,全面展示了这两种技术的应用技巧,帮助Python Web开发者提升项目质量和开发效率。
30 1
|
15天前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
32 1