【爬虫教程】2023最详细的爬虫入门教程~

初识爬虫

学习爬虫之前,我们首先得了解什么是爬虫。 来自于百度百科的解释:

网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

通俗来讲,假如你需要互联网上的信息,如商品价格,图片视频资源等,但你又不想或者不能自己一个一个自己去打开网页收集,这时候你便写了一个程序,让程序按照你指定好的规则去互联网上收集信息,这便是爬虫,我们熟知的百度,谷歌等搜索引擎背后其实也是一个巨大的爬虫。

爬虫合法吗? 可能很多小伙伴都会又这个疑问,首先爬虫是一门技术,技术应该是中立的,合不合法其实取决于你使用目的,是由爬虫背后的人来决定的,而不是爬虫来决定的。另外我们爬取信息的时候也可以稍微‘克制’一下,能拿到自己想要的信息就够了,没必要对着人家一直撸,看看我们的12306都被逼成啥样了???。 一般来说只要不影响人家网站的正常运转,也不是出于商业目的,人家一般也就只会封下的IP,账号之类的,不至于法律风险?。 其实大部分网站都会有一个robots协议,在网站的根目录下会有个robots.txt的文件,里面写明了网站里面哪些内容可以抓取,哪些不允许。 以淘宝为例——https://www.taobao.com/robots.txt

在这里插入图片描述

淘宝Robots协议部分内容

当然robots协议本身也只是一个业内的约定,是不具有法律意义的,所以遵不遵守呢也只能取决于用户本身的底线了。

Why Python

很多人提到爬虫就会想到Python,其实除了Python,其他的语言诸如C,PHP,Java等等都可以写爬虫,而且一般来说这些语言的执行效率还要比Python要高,但为什么目前来说,Python渐渐成为了写很多人写爬虫的第一选择,我简单总结了以下几点:

开发效率高,代码简洁,一行代码就可完成请求,100行可以完成一个复杂的爬虫任务;
爬虫对于代码执行效率要求不高,网站IO才是最影响爬虫效率的。如一个网页请求可能需要100ms,数据处理10ms还是1ms影响不大;
非常多优秀的第三方库,如requests,beautifulsoup,selenium等等; 本文后续内容也将会以Python作为基础来进行讲解。
环境准备

Python安装,这部分可以参考我之前的文章Python环境配置&Pycharm安装,去官网下载对应的安装包,一路Next安装就行了;
pip安装,pip是Python的包管理器,现在的Python安装包一般都会自带pip,不需要自己再去额外安装了;
requests,beautifulsoup库的安装,通过以下语句来完成安装: pip install requests pip install beautifulsoup4
谷歌浏览器(chrome);
第三方库介绍

requests

官方中文文档:https://2.python-requests.org/zh_CN/latest/
requests应该是用Python写爬虫用到最多的库了,同时requests也是目前Github上star✨最多的Python开源项目。 requests在爬虫中一般用于来处理网络请求,接下来会用通过简单的示例来展示requests的基本用法。

首先我们需要倒入requests模块;
import requests
复制

接着我们尝试向baidu发起请求;
r = requests.get(‘https://www.baidu.com/’)
复制

我们现在获得来命名为r的response对象,从这个对象中我们便可以获取到很多信息,如:
状态码,200即为请求成功
页面Html5代码

返回请求状态码,200即为请求成功

print(r.status_code)

返回页面代码

print(r.text)

对于特定类型请求,如Ajax请求返回的json数据

print(r.json())
复制

当然对于大部分网站都会需要你表明你的身份,我们一般正常访问网站都会附带一个请求头(headers)信息,里面包含了你的浏览器,编码等内容,网站会通过这部分信息来判断你的身份,所以我们一般写爬虫也加上一个headers;

添加headers

headers = {‘User-Agent’: ‘Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit’}
r = requests.get(‘https://www.baidu.com/’, headers=headers)
复制

针对post请求,也是一样简单;

添加headers

headers = {‘User-Agent’: ‘Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit’}

post请求

data = {‘users’: ‘abc’, ‘password’: ‘123’}
r = requests.post(‘https://www.weibo.com’, data=data, headers=headers)
复制

很多时候等于需要登录的站点我们可能需要保持一个会话,不然每次请求都先登录一遍效率太低,在requests里面一样很简单;

保持会话

新建一个session对象

sess = requests.session()

先完成登录

sess.post(‘maybe a login url’, data=data, headers=headers)

然后再在这个会话下去访问其他的网址

sess.get(‘other urls’)
复制

beautifulsoup

当我们通过requests获取到整个页面的html5代码之后,我们还得进一步处理,因为我们需要的往往只是整个页面上的一小部分数据,所以我们需要对页面代码html5解析然后筛选提取出我们想要对数据,这时候beautifulsoup便派上用场了。 beautifulsoup之后通过标签+属性的方式来进行定位,譬如说我们想要百度的logo,我们查看页面的html5代码,我们可以发现logo图片是在一个div的标签下,然后class=index-logo-srcnew这个属性下。

在这里插入图片描述

百度

所以我们如果需要定位logo图片的话便可以通过div和class=index-logo-srcnew来进行定位。

下面也会提供一些简单的示例来说明beautifulsoup的基本用法:

导入beautifulsou模块;
from bs4 import BeautifulSoup
复制

对页面代码进行解析,这边选用对html代码是官方示例中使用的爱丽丝页面代码;
html = “”"

The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were , Lacie and Tillie; and they lived at the bottom of a well.

...

""" # 选用lxml解析器来解析 soup = BeautifulSoup(html, 'lxml') 复制

我们现在获得一个命名为soup的Beautifulsoup对象,从这个对象中我们便能定位出我们想要的信息,如:

获取标题

print(soup.title)

获取文本

print(soup.title.text)

通过标签定位

print(soup.find_all(‘a’))

通过属性定位

print(soup.find_all(attrs={‘id’: ‘link1’}))

标签 + 属性定位

print(soup.find_all(‘a’, id=‘link1’))
复制

打印结果如下:

The Dormouse's story The Dormouse's story [ , Lacie, Tillie] [ ] [ ] 复制

案例分享

获取17173新游频道下游戏名

定位我们所需要的信息,记住html里面的位置。
这边可以分享一个小技巧,以前我刚开始写爬虫的时候,寻找代码里面的信息都是先去把整个页面给down下来,然后再在里面Ctrl+F查找,其实大部分浏览器都提供了很简单的方法来定位页面代码位置的,这边会以Chrome浏览器为例。

我的职业生涯开始和大多数码农一样,刚开始接触都是最基础的软件测试、编程语法。那时候在B站CSDN到处找学习资源,在这个吃技术的IT行业来说

,不断学习是至关重要的。但是我之前做的是最基础的业务工作,随着时间的消磨,让我产生了对自我价值和岗位意义的困惑。

我的程序员之路,一路走来都离不开每个阶段的计划,因为自己喜欢规划和总结,所以,我和朋友特意花了一段时间整理编写了下面的《python架构师

学习路线》,也整理了不少【网盘资源】,需要的朋友可以公众号【Python大本营】获取网盘链接。

希望会给你带来帮助和方向。

为了方便理解录制了一个gif,具体步骤如下:

F12打开控制台,选择element标签查看页面代码;
点击控制台左上角箭头,然后点击页面上我们需要的信息,我们可以看到控制台中页面代码直接跳转到对应的位置;
页面代码中一直向上选择标签直至囊括我们需要的所有信息;
记住此时的标签以及熟悉等信息,这将会用于后面解析筛选数据。
在这里插入图片描述
在这里插入图片描述

接下来便可以开始敲代码了,完整代码如下,对于每个步骤均有详细的注释:
from bs4 import BeautifulSoup
import requests

页面url地址

url = ‘http://newgame.17173.com/game-list-0-0-0-0-0-0-0-0-0-0-1-2.html’

发送请求,r为页面响应

r = requests.get(url)

r.text获取页面代码

使用lxml解析页面代码

soup = BeautifulSoup(r.text, ‘lxml’)

两次定位,先找到整个信息区域

info_list = soup.find_all(attrs={‘class’: ‘ptlist ptlist-pc’})

在此区域内获取游戏名,find_all返回的是list

tit_list = info_list[0].find_all(attrs={‘class’: ‘tit’})

遍历获取游戏名

.text可获取文本内容,替换掉文章中的换行符

for title in tit_list:
print(title.text.replace(‘\n’, ‘’))
复制

获取拉勾网职位信息

目前很多网站上的信息都是通过Ajax动态加载的,譬如当你翻看某电商网站的评论,当你点击下一页的时候,网址并没发生变化,但上面的评论都变了,这其实就是通过Ajax动态加载出来的。 这里的下一页➡️按钮并不是只想另外一个页面,而是会在后台发送一个请求,服务器接收到这个请求之后会在当前页面上渲染出来。 其实我自己是比较偏爱爬这种类型的数据的,因为统计Ajax请求返回来的数据都是非常规整的json数据,不需要我们去写复杂的表达式去解析了。 接下来我们将会通过一个拉勾网职位信息的爬虫来说明这类网站的爬取流程:

F12打开控制台,然后搜索‘数据分析’,注意一定是先打开控制台,然后再去搜索,不然请求信息是没有记录下来的。
然后我们去Network标签下的XHR下查找我们需要的请求(动态加载的数请求都是在XHR下);
在这里插入图片描述

然后我们切换到headers标签下,我们可以看到请求的地址和所需到参数等信息;
在这里插入图片描述

实验几次之后我们便能发现这三个参数的含义分别是:
first:是否首页
pn:页码
kd:搜索关键词
正常来说我们直接向这个网址传first, pn,kd三个参数就好了,不过尝试了几次之后发现拉勾有如下比较有意思的限制:
headers里面referer参数是必须的,referer是向服务器表示你是从哪个页面跳转过来的;
必须得先访问这个referer的网址,然后再去请求职位信息的API。
代码如下,也很简单,不过三十几行:
import requests

class Config:
kd = ‘数据分析’
referer = ‘https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?labelWords=&fromSearch=true&suginput=’
headers = {
‘Accept’: ‘application/json, text/javascript, /; q=0.01’,
‘Referer’: referer,
‘User-Agent’: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/’
‘537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36’}

class Spider:

def __init__(self, kd=Config.kd):self.kd = kdself.url = Config.refererself.api = 'https://www.lagou.com/jobs/positionAjax.json'# 必须先请求referer网址self.sess = requests.session()self.sess.get(self.url, headers=Config.headers)def get_position(self, pn):data = {'first': 'true','pn': str(pn),'kd': self.kd}# 向API发起POST请求r = self.sess.post(self.api, headers=Config.headers, data=data)# 直接.json()解析数据return r.json()['content']['positionResult']['result']def engine(self, total_pn):for pn in range(1, total_pn + 1):results = self.get_position(pn)for pos in results:print(pos['positionName'], pos['companyShortName'], pos['workYear'], pos['salary'])

if name == ‘main’:
lagou = Spider()
lagou.engine(2)
复制

附上执行结果:
数据分析-客服中心(J10558) 哈啰出行 3-5年 9k-15k
大数据分析师 建信金科 3-5年 16k-30k

数据分析师-【快影】 快手 3-5年 15k-30k
数据分析师(业务分析)-【商业化】 快手 3-5年 20k-40k
数据分析师 思创客 1-3年 6k-12k
复制

全文完~~

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

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

相关文章

React之受控组件和非受控组件以及高阶组件

一、受控组件 受控组件,简单来讲,就是受我们控制的组件,组件的状态全程响应外部数据 举个简单的例子: class TestComponent extends React.Component {constructor (props) {super(props);this.state { username: lindaidai }…

Java版本+企业电子招投标系统源代码+支持二开+招投标系统+中小型企业采购供应商招投标平台

功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外部供…

轻量级超分网络:Edge-oriented Convolution Block for Real-timeMM21_ECBSR 和 eSR

文章目录 ECBSR(Edge-oriented Convolution Block for Real-timeMM21_ECBSR)1. 作者目的是开发一个高效的适合移动端的超分网络。2. 作者决定使用plain net ,但是效果不好,因此利用重参数化方法,丰富特征表示。3. re-p…

openssl生成SM2公私钥对命令详解

(1)获得openssl支持椭圆曲线算法列表 命令:openssl ecparam -list_curves 返回结果: secp112r1 : SECG/WTLS curve over a 112 bit prime field secp112r2 : SECG curve over a 112 bit prime field secp128r1 : SE…

工程云平台源码 建筑工地劳务实名制、危大工程监管平台源码

智慧工地的核心是数字化,它通过传感器、监控设备、智能终端等技术手段,实现对工地各个环节的实时数据采集和传输,如环境温度、湿度、噪音等数据信息,将数据汇集到云端进行处理和分析,生成各种报表、图表和预警信息&…

[备忘]WindowsLinux上查看端口被什么进程占用|端口占用

Windows上 查看端口占用&#xff1a; netstat -aon|findstr <端口号> 通过进程ID查询进程信息 tasklist | findstr <上一步查出来的进程号> 图例&#xff1a; Linux 上 查看端口占用&#xff1a; netstat -tuln | grep <端口号> lsof -i:<端口号&…

安徽怀宁领导一行莅临蓝海彤翔集团参观考察

10月17日上午&#xff0c;中共怀宁县委书记余学峰&#xff0c;怀宁县政府副县长谭宪锋、怀宁县委办主任刘劲松、怀宁县招商中心副主任余飞、怀宁县委办四级主任科员彭俊等领导一行莅临蓝海彤翔集团参观考察&#xff0c;集团总裁鲁永泉、集团CTO穆凯辉接待了考察团一行。 考察团…

Flutter笔记:发布一个Flutter头像模块 easy_avatar

Flutter笔记 发布一个头像Flutter模块 easy_avatar 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/1339…

PHP 如何查看php函数源码

一、在git找到php对应的版本 找到对应的分支版本可以下载也可以在线直接查看 通过这个地址 https://github.com/php/php-src 二、下面已shuffle函数举例&#xff0c;版本为7.4 找到对应的版本进入 点击ext&#xff0c;这个文件夹里面是存放函数的目录 在文件夹里搜不到stu…

高并发场景下常见的限流算法及方案介绍

应用场景 现代互联网很多业务场景&#xff0c;比如秒杀、下单、查询商品详情&#xff0c;最大特点就是高并发&#xff0c;而往往我们的系统不能承受这么大的流量&#xff0c;继而产生了很多的应对措施&#xff1a;CDN、消息队列、多级缓存、异地多活。 但是无论如何优化&…

招投标系统软件源码,招投标全流程在线化管理

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

基于svg+js实现简单动态时钟

实现思路 创建SVG容器&#xff1a;首先&#xff0c;创建一个SVG容器元素&#xff0c;用于容纳时钟的各个部分。指定SVG的宽度、高度以及命名空间。 <svg width"200" height"200" xmlns"http://www.w3.org/2000/svg"><!-- 在此添加时钟…

FPGA ZYNQ VIVADO创建IP核点亮LED灯 方式一

这里写自定义目录标题 PL端 纯Verilog语言创建IP核实现点亮LED灯工使用设备 ZYNQ 7010&#xff0c;选择设备型号XC7Z010CLG400-1根据以下流程完成本次创建时钟频率50MHZ&#xff0c;周期T20ns&#xff0c;因此计数50_000_000次&#xff0c;1sLED灯闪烁一次 PL端 纯Verilog语言创…

unigui添加ssl(https)访问的方法

首先到腾讯云或者阿里云去申请免费的证书&#xff0c;前提是在该服务商那有申请过域名&#xff0c;怎么找出这个界面&#xff1f;网页顶部一般都有个搜索框&#xff0c;输入【证书】或者【SSL】就能看到了&#xff0c;然后点击申请免费证书&#xff0c;把解析信息填入自己的域名…

k8s-18 认证授权

Authentication (认证) 认证方式现共有8种&#xff0c;可以启用一种或多种认证方式&#xff0c;只要有一种认证方式通过&#xff0c;就不再进行其它方式的认证。通常启用X509 Client Certs和Service Accout Tokens两种认证方式 Kubernetes集群有两类用户:由Kubernetes管理的Ser…

Linux网络编程系列之服务器编程——多路复用模型

Linux网络编程系列 &#xff08;够吃&#xff0c;管饱&#xff09; 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

肿瘤科常用评估量表汇总,建议收藏!

根据肿瘤科医生的量表使用情况&#xff0c;笔者整理了10个肿瘤科常用量表&#xff0c;可在线评测直接出结果&#xff0c;可转发使用&#xff0c;可生成二维码使用&#xff0c;可创建项目进行数据管理&#xff0c;有需要的小伙伴赶紧收藏&#xff01; 肿瘤患者的ECOG评分标准 肿…

Spring中Setter注入详解

目录 一、setter注入是什么 二、setter注入详解 三、JDK内置类型注入方式 3.1 数组类型 3.2 set集合类型 3.3 list集合 3.4 map集合 3.5 properties类型 四、用户自定义类型 一、setter注入是什么 书接上回&#xff0c;我们发现在Spring配置文件中为类对象的属性赋值时&#x…

MATLAB——RBF、GRNN和PNN神经网络案例参考程序

欢迎关注“电击小子程高兴的MATLAB小屋” GRNN_PNN程序 %% I. 清空环境变量 clear all clc %% II. 训练集/测试集产生 %% % 1. 导入数据 load iris_data.mat %% % 2 随机产生训练集和测试集 P_train []; T_train []; P_test []; T_test []; for i 1:3 temp_input …

编辑器功能:用一个快捷键来【锁定】或【解开】Inspector面板

一、需求 我有一个脚本&#xff0c;上面暴露了许多参数&#xff0c;我要在场景中拖物体给它进行配置。 如果不锁定Inspector面板的话&#xff0c;每次点击物体后&#xff0c;Inspector的内容就是刚点击的物体的内容&#xff0c;而不是挂载脚本的参数面板。 二、 解决 &…