爬虫 404 try_和我一起学爬虫

f1d14eea05a2a446257d70d4b3fdac2a.png

前几天就想写一个爬虫系列的文章,因为比较忙所以没有写(还不是因为懒),趁着现在屋里比较的凉爽,心也比较的静,总结下目前遇到的一些爬虫知识,本系列将从简单的爬虫开始说起,以后会逐渐的提升难度,同时会对反爬手段做一个总结,以及用具体的事例来演示,不同的反爬现象和实现手段。

前言

本系列侧重点是应用和实战,所以,对于软件的安装这些基本操作不做详细讲解,我这里认为你已经有了一定的python基础,所以对于python的安装一定会有一定的了解了,这里废话不多说让我们进入正题。

环境准备

鉴于大多数人的系统是windows系统,所以这里的所有内容都是在Windows下进行的,另外推荐安装谷歌浏览器,使用语言python,版本3.6(低版本不能使用requests_html)。主要的爬虫模块requests_html。

爬虫具备的基本条件

作为一个合格的爬虫,首先得有一个headers,如何理解headers,我们打开谷歌浏览器,然后F12,选择network选项卡,打开百度的首页,然后打开然后选择其中的一个链接,然后点击新弹出的窗口的headers,看到有一个'Request Headers',我们看到下面红框的内容,这些由:组成的数据结构,共同构成了一个headers,在python中可以把这些字段作为一个字典传入。

24d32e534b4a42c3b304f5f395821864.png

爬虫的代码实现

下面我来看一个基本爬虫代码,爬取百度的导航栏文字内容。
1.导入requests_html模块。

from requests_html import HTMLSession

2.创建一个session对象,目的是维持一次完整的会话。

session=HTMLSession()

3.通过get方法访问网络

url='https://www.baidu.com'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'}
req=session.get(url=url,headers=headers)

get方法需要传入两个参数,一个是url,一个是headers(字典类型)。一般的我们传入一个user_agent就可以愉快的使用了。(这里只是说一般的对于有先网站服务器还会监测headers的其他属性内容)。我们会获取一个response对象。

拓展:如果查看requests_html的源码会发现默认是给了几个headers属性的。

def default_headers():""":rtype: requests.structures.CaseInsensitiveDict"""return CaseInsensitiveDict({'User-Agent': default_user_agent(),  #这个就是一个随机的useragent'Accept-Encoding': ', '.join(('gzip', 'deflate')),#接收编码类型'Accept': '*/*',#接收文件类型'Connection': 'keep-alive',#保持链接})

4.获取网页返回的状态码
一般的我们把200状态码认为是响应成功(并不一定是你想要的结果,比如登陆失败有些也是200)。
其他常见的还有,404网页访问失败,500服务器拒绝访问,302和301作为网页的重定向。

if req.status_code==200:print("ok")

5.获取正确的网页编码
因为每个页面的编码不同,可能导致在解析的时候出现乱码的情况,对此requests_html模块为我们提供了一个可以高准确率获取编码的方法,目前来看对于绝大对数html页面是没有问题的,所以可以放心使用。

req.encoding=req.apparent_encoding

6.查看获取html源码
此时我们已经获取了编码之后的对象了,如果我们需要查看获取的内容以及编码是否正确我们可以使用text属性来获取网页的源码,它是一个字符串格式的。
7.xpath表达式的使用
requets_html模块的一个好处就是集合了众多的网页解析模块比如,bs4,pyquery,lxml等,可以说相当的强大了,requests_html通过response的html属性调用xpath方法,来直接操作dom对象,通过观察我们获取百度导航栏的标题的xpath,代码我们可以这样写。

 node_list=req.html.xpath("//div[@id='u1']/a/text()")

简单说下上面xpath表达式的含义,//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。/表示从根节点选取。后面跟的ediv表示是div节点,中括号里面一般是做属性判断@id就是判断id属性然后取其值为ul的,后面紧跟的/a,表示上面div节点的下级所有含有a的节点,然后后面的text()是表示获取该节点的文本信息。
8综合整理下上面的代码如下:

from requests_html import HTMLSession
from traceback import format_exc
class BaiDu():def __init__(self):self.session=HTMLSession()self.url='https://www.baidu.com'self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'}self.timeout=20def gethtml(self):try:req=self.session.get(url=self.url,headers=self.headers,timeout=self.timeout)if req.status_code==200:req.encoding=req.apparent_encodingtitle_info=self.parse_html(req)return ' | '.join(title_info)except:print("出错了错误内容是",format_exc)def parse_html(self,req):node_list=req.html.xpath("//div[@id='u1']/a/text()")return node_list
if __name__ == '__main__':baidu=BaiDu()title=baidu.gethtml()print(title)

输出结果:

新闻 | hao123 | 地图 | 视频 | 贴吧 | 学术 | 登录 | 设置 | 更多产品

好了,今天的内容就到这,内容比较的简单,简单的说了下爬虫的基本思路,后面会一步步加大难度,如有任何问题和疑问欢迎留言。

关注微信公众号:python学习开发 ,学习更多python知识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

女神一秒变路人!腾讯研究AI卸妆效果算法出品“一键卸妆”功能

综合自:快科技、腾讯国际计算机视觉大会(ICCV)于 10 月 22 日到 29 日在意大利威尼斯举办,会上,腾讯优图团队带来了一个让所有女生恨得牙痒痒的功能——“一键卸妆”。所谓道高一尺魔高一丈,美图秀秀造福了…

matlab基于ssd的角点匹配_基于关键点的目标检测

0 1前言:基于锚点的目标检测方法在基于关键点(key points)的目标检测方法出现之前,主流目标检测方法一般先设置一些预先定义好的 锚点 (anchor boxes)。 作为预测物体框的参考,神经网络只需要预测实际的物体框相对于这些锚点的偏移。 这样模型…

NLog整合Exceptionless

前言在实际的.Net Core相关项目开发中,很多人都会把NLog作为日志框架的首选,主要是源于它的强大和它的扩展性。同时很多时候我们需要集中式的采集日志,这时候仅仅使用NLog是不够的,NLog主要是负责代码中日志的落地,也就…

40个只有程序员才看得懂的段子

1. 一程序员去面试,面试官问:“你毕业才两年,这三年工作经验是怎么来的?!”程序员答:“加班。”2. 某程序员对书法十分感兴趣,退休后决定在这方面有所建树。于是花重金购买了上等的文房四宝。一…

MySQL8的inodb参数设置_MySQL8.0自适应参数innodb_dedicated_server

MySQL8.0有了一个新参数又叫自适应参数 innodb_dedicated_server将innodb_dedicated_server开启的时候,它可以自动的调整下面这四个参数的值:innodb_buffer_pool_size 总内存大小innodb_log_file_size redo文件大小innodb_log_files_in_group redo文件数…

让 gRPC 提供 REST 服务

让 gRPC 提供 REST 服务IntrogRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。这些特性使得其在移动设备上表现更好,更省电…

10张图看懂瞎忙和高效的区别

时间是最公平的,每个人一天都是24小时,一年都是365天。但是,不同的人的产出却是天差地别。人和人的差距为什么这么大?而且这种差距,并不是家庭背景、权利财富或天赋带来的,仅仅是我们对时间的掌控。正好看到…

Canvas的save和restore

在创建新的控件或修改现有的控件时,我们都会涉及到重写控件或View的onDraw方法。 onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。 在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的…

鉴别一个人是否 js 入门的标准竟然是?!

不知不觉跳入前端「大坑」也已经有大半年了,学到了很多知识。为了让知识更好地沉淀,我打算写一系列的知识总结,希望能在回顾知识的同时也能帮到别的同学。忘记在哪里看到过,有人说鉴别一个人是否 js 入门的标准就是看他有没有理解…

面向对象编程设计模式--简单工厂模式讲解(历史上最简单明白的例子)

工作之余,在看资料过程中发现一个极易理解的简单工厂模式的例子,自己亲自试练一番,感觉对这个设计模式不熟悉的朋友,一看马上就知道是什么回事了。 简单工厂模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返的类…

.NET 6 Preview 1 开箱,带你体验新版本

最近 .NET 6 Preview 1 发布了,.NET 统一是此版本的核心。大家可以读一下原文博客:https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-1/.NET 6.0 SDK 和 Runtime 下载地址:https://dotnet.microsoft.com/download/dotnet/6.0…

redis 清空缓存_「镜头回放」简直了!spring中清除redis缓存导致应用挂死

异常场景springWeb应用一直运行正常,同事最近反应,每次版本更新完毕,刷新缓存,就会导致应用挂死。只有重启redis应用才恢复正常。项目概况springWeb项目,常用配置表做了redis缓存,配置表中只有少量数据&…

25岁社招进阿里,从电商到有赞新零售,他仅1年就打开了马云一直想做的新领域!

最近关于「新零售」的声音此起彼伏:阿里巨资收购高鑫零售,腾讯确认入股永辉超市……自2016年10月马云第一次提出了「新零售」概念之后,各巨头跑马圈地,线下成为了必争之地,新零售的蓝海才刚刚打开。而李星,…

C#连接MySQL数据库实例

项目目的:连接mysql查询数据并将数据显示到界面的datagridview里面.Step1:添加动态链接库文件Visual Studio,在 项目(右键)-管理NuGet程序包(N) 然后在浏览里面搜索MySql.Data并进行安装。Step2:using所需要的库using MySql.Data.MySqlClient;step3&…

链接服务器 慢_redis服务器cpu100%的原因和解决方案

首先引起cpu100%可能的几大原因:1.redis连接数过高2.数据持久化导致的阻塞3.主从存在频繁全量同步4.value值过大5.redis慢查询为了模拟redis服务器cpu100%,临时买了一台阿里云ecs,并把那天清空前的redis备份还原到服务器上。下面我们按照顺序…

有人问我:AI这么火,要不要去追赶AI的热潮?

12月14日,吴恩达发布微博:我很高兴地宣布Landing.ai的成立,开始进入AI产业。 作为一家人工智能(AI)公司,Landing.ai旨在帮助企业在人工智能时代实现转型。这一动作让人们对AI的关注度在2017年的末尾又一次升…

过完年,又不想上班了?

大家新年好,我是Z哥。每次过完年,不少人会多增加一份焦虑,这份焦虑表面上看是“不想上班”,但实际上可能是职业规划的缺失导致。因为缺少对未来的预期、憧憬,导致对自己的工作没有热情。这种情况的另一种叫法是「职业倦…

15天助你掌握问卷统计与Spss实战

最近总是有小伙伴咨询超模君关于数据分析的问题,比如数据分析是什么、怎样才能速成数据分析等等,今天超模君就抽个空跟大家谈谈数据分析那些事儿。首先,我们先来了解了解小伙伴所提到的数据分析。数据分析是指用适当的统计分析方法对收集来的…

aswing学习笔记3-在JPanel中,如何将.png格式的图片设置为背景?

在JPanel中,如何将.png格式的图片设置为背景?2009-03-04 19:21在JPanel中,如何将.png格式的图片设置为背景? 发表于 : 周三 6月 04, 2008 3:53 pm由 tvrcaiyy在JPanel中,如何将.png格式的图片设置为背景?能…

在.NET Core 中使用 FluentValidation 进行规则验证

不用说,规则验证很重要,无效的参数,可能会导致程序的异常。如果使用Web API或MVC页面,那么可能习惯了自带的规则验证,我们的控制器很干净:public class User {[Required]public string FirstName { get; se…