Python写网络爬虫(一)

文章目录

    • 网络爬虫简介
    • 爬虫在使用场景中的分类
    • 爬虫的矛与盾
    • 需要知道的协议
    • 常用请求头信息
    • 常用响应头信息
    • requests模块
    • 如何使用requests:(requests模块的编码流程)
    • 新手实战演练
    • 正式入门爬虫
    • get 方法的常用参数:
    • 简易网页采集器

首先,在学习网络爬虫之前,需要先了解它是什么!

网络爬虫简介

网络爬虫:web crawler(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

上面这些都是百度百科晦涩难懂的官话,用我们自己的话来说,
爬虫就是:通过我们自己编写的程序,模拟浏览器上网,然后让其去互联网抓取我们想要的数据的过程。

爬虫在使用场景中的分类

  1. 通用爬虫:
    抓取系统的重要组成部分。即抓取互联网中一整张页面数据。
  2. 聚焦爬虫:
    建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容。
    PS:先用通用爬虫爬取一整张页面信息,再用聚焦爬虫抓取局部内容。
  3. 增量式爬虫:
    检测网站中数据更新的情况。即只会抓取网站中最新更新出来的数据。

爬虫的矛与盾

  • 反爬机制(盾):
    门户网站可以通过制订相应的策略和技术手段,防止爬虫程序进行网站数据的爬取。
  • 反反爬机制(矛):
    爬虫程序可以制订相关的策略和技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站中相关的数据。

需要知道的协议

  • robots.txt协议:
    君子协议。规定了网站中哪些数据可以被爬虫爬取,哪些不能。
    (额 但实际上想爬就爬了,拦不住。但人要有道德!,也要谨防进橘子)

    这个是某网站的robots.txt协议的规定
    在这里插入图片描述

  • http协议:
    通俗来说就是 服务器和客户端进行数据交互的一种形式

  • https协议:
    简单说就是 安全的http(超文本传输)协议

常用请求头信息

  • User-Agent:
    请求载体的身份标识
    (请求载体:当前浏览器;身份标识:操作系统版本,当前浏览器版本等信息)
    User-Agent

  • Connection:请求完毕后,是断开连接(close)还是保持连接(keep-alive)在这里插入图片描述

常用响应头信息

  • Content-Type:
    服务器响应回客户端的数据类型在这里插入图片描述

requests模块

Python中原生的一款基于网络请求的模块,功能非常强大,简单便携,效率极高。

作用:
模拟浏览器发请求。

以上就是我们在学习爬虫之前需要了解的内容
接下来我们正式进入爬虫领域

首先思考我们自己上网的步骤:

第一步:打开浏览器
第二步:在浏览器中录入网址
第三步:回车
最后就会得到我们想找的网址

但其实回车后会先对指定网址发送http或https请求,请求成功后才会获得对应的响应数据,即我们想找的页面。

通过我们自己的上网行为即可初见requests的使用方式。

如何使用requests:(requests模块的编码流程)

  1. 指定url (网页地址,即网址)
  2. 发起请求 (http/https请求,输网址按回车后计算机干的事)
  3. 获取响应数据 (页面打开了)
  4. 持久化存储 (把爬取到的数据存储到本地或数据库中)

用requests之前要先进行环境安装:
pip install requests

在PyCharm中 File --> Settings --> Project --> Interpreter -->点击+即可添加

话不多说,上代码!

新手实战演练

# 我的第一个爬虫程序
import requestsurl = "https://www.csdn.net/"  # step 1:指定url
response = requests.get(url)  # step 2:发起请求,get方法会返回一个响应对象
page_text = response.text  # step 3:获取响应数据,text返回的是字符串形式的数据
with open('CSDN.html', 'w', encoding='utf-8') as f:  # step 4:持久化存储f.write(page_text)
print('爬取数据结束')

下面是爬取结果

在这里插入图片描述
这样我们就得到了CSDN网页的源代码

接下来我们逐个解析上面的代码:

  1. URL 等于的是我们要爬取的网页地址

  2. 我们看到
    在这里插入图片描述
    网页请求方式(Request Method)是GET类型,那么我们在用requests模拟浏览器请求时也要用get请求!!!
    那么,requests.get(url)就是向指定的url发送请求。
    用response接收请求成功后返回的响应对象,即 response = requests.get(url)

  3. response是响应对象,它也有属性 — text 。这个text会返回一组字符串,这组字符串就是我们想要 拿到的响应数据,即网页的html源码数据。
    所以 response.text 就是网页的源码数据 ,把这组数据返回给 page_text 这个变量,就是
    page_text = response.text 的意思

  4. 持久化存储

with open('CSDN.html', 'w', encoding='utf-8') as f:  # step 4:持久化存储f.write(page_text)

把爬取到的数据存入.html文件中
在这里插入图片描述这样,一个最简单的爬虫就完成了!

正式入门爬虫

刚才写的那个爬虫呀 不太完整,为什么呢?这就不得不提到我们的UA检测了

反爬策略—UA检测:
门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器,说明该请求是一个正常的请求。但如果检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常的请求(爬虫),那么服务器端会拒绝该次请求。

对于UA检测爬虫就毫无办法了吗?nonono

反反爬策略—UA伪装:
让爬虫对应的请求载体身份标识伪装成某款浏览器。
做法:将对应的 user-agent 封装到字典中
在这里插入图片描述
在开发者工具(F12)中找我们需要的 user-agent

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (HTML, like Gecko) Chrome/84.0.4147.89 ''Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/30 '
}

通过UA伪装,爬虫才能更好的爬取网页数据。UA伪装必不可少!!!

get 方法的常用参数:

requests.get (url , params , headers)

  1. url参数 是网址
  2. headers参数 是头请求
  3. params参数 设定好后,网页会和 params 通过 get 方法自动拼接
params = {'看网页搜索的具体参数': '参数的值'
}

简易网页采集器

先上代码

import requestsurl = 'https://so.csdn.net/so/search'  # 处理url携带的参数
head = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 ''Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/30 '
}
select = input('请输入想搜索的关键字:')
param = {'q': select,'t': 'all',}
response = requests.get(url, params=param, headers=head, verify=False)
page_text = response.text
FileName = select + '.html'
with open(FileName, 'w', encoding='utf-8') as f:f.write(page_text)
print('爬取数据完成!!!')

这是我选择的网址

https://so.csdn.net/so/search?spm=1000.2115.3001.4501&q=%E6%A6%82%E7%8E%87%E5%AF%86%E5%BA%A6%E5%87%BD%E6%95%B0&t=&u=

我们首先要知道,?后面那一堆都是参数,参数我们可以通过get方法与url拼接,所以在写url时要把它删掉,所以 url = ‘https://so.csdn.net/so/search’
往下是headers头请求不用多说,每个爬虫程序都要写!
再往下就该处理参数了,我是怎么知道这些参数的呢?还得借助 F12 !
在这里插入图片描述

这些就是我们需要的参数了。咦,有没有感觉很熟悉呢?
没错,它们就是刚刚删除?后的乱码。

https://so.csdn.net/so/search?spm=1000.2115.3001.4501&q=概率密度函数&t=&u=

这下发现了吧!

我们把参数封装在一个字典里,就成了这个样子

param = {'q': select,'t': 'all',}

但我想要实现动态查询,即输入什么查询什么,所以我不把参数 ‘q’ 写死,而是用了个变量 select 作为 ‘q’ 的值。

接下来按部就班:

  • 发起请求
  • 获得响应数据
  • 持久化存储

就OK了 ,是不是很简单呢

运行结果:

在这里插入图片描述

需要注意的是,有些电脑缺少证书,请求时就要在 response 里加上 verify=False 参数 。

我身边人都不用,就我用在这里插入图片描述

最后,感谢铁甲小宝同学对我的指导,他是我学习的领路人,未来继续跟大佬学习
在这里插入图片描述

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

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

相关文章

那个顶撞雷军还爱在办公室打乒乓的副总裁——周光平

文章原创来自洞见网:http://www.localonline.com.cn/start/people/712.html,转载请注明出处。 近日,东南大学(原南京工学院)1977级校友周光平、严星夫妇捐资2000万元,在母校设立“平星基金”,用于支持信息科学与工程学…

雷军—我十年的程序员生涯

内容转自:http://blog.sina.com.cn/s/blog_4b0e23c90100b2qf.html 最近,和UCWEB同事讨论,怎么才能把我们的UCWEB做到极致。我说,“手机上的平台非常多,如果想做好,需要足够多、足够优秀的程序员。优秀的程序…

雷军谈人生三段低谷:站店卖货、泡吧泡论坛、错失互联网第一波浪潮!

自2020年小米十周年雷军进行了人生首次公开演讲以来,他似乎想要养成一种习惯,每年都举办一次年度演讲。 继2020年“相信自己,一往无前”和2021年“我的梦想,我的选择”两场年度演讲后,这不,在小米迎来12周…

中国第一程序员求伯君,WPS之父,雷军也佩服的人

中国第一程序员求伯君,WPS之父,最强码农的传奇经历 转载知乎冷冷读书 https://www.zhihu.com/people/leng-leng-80-6 2018年底,金山举办创业三十年庆典,三位创始人,求伯君、雷军和张旋龙相继到场。庆生中,雷…

用互联网思想武装自己---雷军

两年前的4月6日,我们几个人,在北四环的银谷大厦静悄悄的创办了小米公司,一起喝了碗小米粥,就开始艰难的创业之旅。仅仅两年时间,小米在百度手机品牌排行榜排在前五名,也在淘宝销售排行榜名列前茅&#xff0…

身价10亿的程序员 雷军当年也为他打工——WPS之父 求伯君

他的前半生,值得我们每一个人深思。 在普通人眼里,他寂寂无名,只有年岁稍长的文化人,才听说过他传奇般的存在。 在IT人眼里,他是块活化石,中国第一的大旗除了他,没人敢抗! 他是求…

雷军主导小米管理层变革:创业派隐退 职业经理人上位

雷递网 雷建平 12月23日 岁末之际,在京东零售大幅调整后,小米也进行了一轮大调整。 小米集团内部邮件所示,小米总裁王翔将在月底卸任集团总裁职务退休,同时,继续作为高级顾问为公司服务。 小米集团总裁一职将由2019年加…

雷军与周鸿祎:两个九头鸟的战争

一场 智能手机 的口水大战将雷军和周鸿祎推到风口浪尖。有一句俗话叫“天上九头鸟,地上湖北佬”,来形容湖北人的精明、睿智。 小米科技董事长兼CEO雷军、奇虎360董事长周鸿祎同是湖北人。雷军1969年12月16日于湖北仙桃,一个教师家庭&#…

雷军的演讲以及产品发布

8月11号是小米的发布会,还有雷军的年度演讲。 因为工作冲突我没看直播,晚上回来看了公众号文章和知乎上的内容讨论,也看了发布的新产品。 雷军那个年代能够做上程序员一定是非常牛逼的人,而雷军是这些牛逼人的公司总经理&#xff…

雷军写代码水平如何?

3月30日,小米集团发布公告,公司拟成立一家全资子公司,负责智能电动汽车业务。首期投资为100亿元人民币,预计未来10年投资额100亿美元,而智能电动汽车业务的首席执行官依然由雷军担任。 雷军说:我愿意押上我…

雷军 1994 年写的代码

(给程序员的那些事加星标) 整合整理:程序员的那些事(id:iProgrammer) 前些天,「程序员的那些事」在趣图栏目中分享了《趣图:雷军的代码像诗一样优雅》。 有些网友在评论中质疑&#…

从小米科技的创始人、董事长、首席执行官雷军的代码水平说起

作为小米科技的创始人、董事长和首席执行官,雷军的名字如雷贯耳。那么作为技术员出身的雷军,他的代码水平如何,最近也成为网上的一个热点议题。 伴随这个热点议题一起出现的是雷军写于1994年的RAMinit程序源码。 ; (完整代码附后…

雷军 1994 年写的代码,你见过吗?厉害了!

作为小米科技的创始人、董事长和首席执行官,雷军的名字如雷贯耳。网上出现一篇“刘强东的代码水平如何”的文章,有网友在下面回复“代码只服雷军”。雷军的代码水平真的很牛吗? 原来雷军年轻的时候,也是一名程序员,而且一干就是…

Verilog面试题(一)——2020乐鑫科技数字IC(串转并、饮料售卖机)

文章目录 题目一:将一个串行执行的C语言算法转化为单拍完成的并行可综合verilog。思路代码知乎数字芯片实验室牛客讨论区 题目二:饮料售卖机思路E课网代码(牛客讨论区) 题目一:将一个串行执行的C语言算法转化为单拍完成…

乐鑫科技2022提前批-数字IC类6.29

1/10[单选|3分] 十六进制数0x12345678为big-endian格式,对应的little-endian格式是: 0x87654321 0x78563412 0x56781234 其他都不正确 2/10[单选|3分] X,Y是两个无符号定点小数&…

乐鑫科技数字芯片2017

1. setup time、hold time 含义,并说明setup time和hold time会出现负值的原因 setup time是指在触发器的时钟信号触发之前,数据需要稳定不变的时间 hold time 是指在触发器的时钟信号触发之后,数据需要稳定不变的时间 在考虑时钟skew的…

乐鑫科技数字芯片2020

&#xff08;1&#xff09;序列发生器&#xff0c;产生周期性的"0010110111"序列 module xlgen (clk,rst,Q);input clk ; input rst ;output Q ; reg Q ; reg [9:0] Q_r ;always ( posedge clk or posedge rst) beginif (rst 1) beginQ < 1b0;Q_r < 10b00…

乐鑫科技数字IC提前批2021

整理乐鑫科技2021届招聘的数字IC提前批笔试题&#xff0c;并做了部分答案和解析&#xff0c;有问题的地方欢迎一起探讨。 一&#xff0e;单选题 1.关于跨时钟域电路的设计&#xff0c;以下说法正确的是: A: 信号经两级D触发器同步后即可进行跨时钟域传递 B: 跨时钟域电路存在亚…

乐鑫科技2020数字芯片

摘抄至数字芯片实验室 1、设计一个序列信号发生器电路&#xff0c;能在CLK信号作用下周期性输出“0010110111”的序列信号 2、设计一个自动饮料售卖机&#xff0c;共有两种饮料&#xff0c;其中饮料A每个10分钱&#xff0c;饮料B每个5分钱&#xff0c;硬币有5分和10分两种&a…