「爬虫教程」吐血整理,最详细的爬虫入门教程

2023-11-09

初识爬虫

在这里插入图片描述

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

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

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

爬虫合法吗?

可能很多小伙伴都会有这个疑问,首先爬虫是一门技术,技术应该是中立的,合不合法其实取决于你使用目的,是由爬虫背后的人来决定的,而不是爬虫来决定的。

一般来说只要不影响人家网站的正常运转,也不是出于商业目的,人家一般也就只会封下的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 requestspip 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/')
1
  • 我们现在获得来命名为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这个属性下。
在这里插入图片描述

浏览器F12打开控制台即可看到页面代码

所以我们如果需要定位logo图片的话便可以通过div和class=index-logo-srcnew来进行定位。下面也会提供一些简单的示例来说明beautifulsoup的基本用法:

  • 导入beautifulsou模块;
from bs4 import BeautifulSoup
  • 对页面代码进行解析,这边选用对html代码是官方示例中使用的爱丽丝页面代码;
html = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title" name="dromouse"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1"><!-- Elsie --></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
"""
# 选用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'))

打印结果如下:

<title>The Dormouse's story</title>
The Dormouse's story
[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]
[<a class="sister" href="http://example.com/elsie" id="link1"><!-- Elsie --></a>]


案例分享


获取17173新游频道下游戏名

  • 定位我们所需要的信息,记住html里面的位置。

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

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

  1. F12打开控制台选择element标签查看页面代码
  2. 点击控制台左上角箭头,然后点击页面上我们需要的信息,我们可以看到控制台中页面代码直接跳转到对应的位置;
  3. 页面代码中一直向上选择标签直至囊括我们需要的所有信息;
  4. 记住此时的标签以及属性等信息,这将会用于后面解析筛选数据。
    在这里插入图片描述
  • 接下来便可以开始敲代码了,完整代码如下,对于每个步骤均有详细的注释:
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 = kd
        self.url = Config.referer
        self.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

知道你对python感兴趣,所以给你准备了下面的资料~

这份完整版的Python全套学习资料已经上传,朋友们如果需要可以点击链接免费领取或者滑到最后扫描二v码【保证100%免费

python学习资源免费分享,保证100%免费!!!

需要的话可以点击这里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

「爬虫教程」吐血整理,最详细的爬虫入门教程 的相关文章

  • Pygame读取MIDI输入

    我参考了Pygame MIDI 文档 https www pygame org docs ref midi html and 这段代码 https stackoverflow com questions 62983509 pygame mi
  • openpyxl 2.4.2:保存后公式生成的单元格值为空

    我使用 openpyxl 打开文件 编辑一些单元格并保存更改 这是一个例子 import openpyxl book openpyxl load workbook sheet path sheet book active for row i
  • 使用 python 制作本地服务器应用程序的最佳方法

    我想要简单轻松地集成 python 和 vba 人们 如果他们在阅读本文后亲自见到我 阅读本文可能会杀了我 但我正在使用 django 开发服务器来实现此目的 有没有什么简单又好的方法 仅举个例子 我想使用 python 模块 openpy
  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • 如何使用pycaffe重构caffe网络

    我想要的是 加载网络后 我将分解一些特定的图层并保存新的网络 例如 原网 数据 gt conv1 gt conv2 gt fc1 gt fc2 gt softmax New net 数据 gt conv1 1 gt conv1 2 gt c
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 如何用 python 和 sympy 解决多元不等式?

    我对使用 python 和 Sympy 还很陌生 并且遇到了使用 sympy 解决多元不等式的问题 假设我的文件中有很多函数 如下所示 cst sqrt x 2 cst exp sqrt cst x 1 4 log log sqrt cst
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • 将一个时间序列插入到 pandas 中的另一个时间序列中

    我有一组定期测量的值 说 import pandas as pd import numpy as np rng pd date range 2013 01 01 periods 12 freq H data pd Series np ran
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • 字典的嵌套列表

    我正在尝试创建dict通过嵌套list groups Group1 A B Group2 C D L y x 0 for y in x if y x 0 for x in groups d k v for d in L for k v in
  • 我可以使用 dask 创建 multivariate_normal 矩阵吗?

    有点相关这个帖子 https stackoverflow com questions 52337612 random multivariate normal on a dask array 我正在尝试复制multivariate norma
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • 在 Windows 上使用 IPython 笔记本时出现 500 服务器错误

    我刚刚在 Windows 7 Professional 64 位上全新安装了 IPython 笔记本 我采取的步骤是 从以下位置安装 Python 3 4 1http python org http python org gt pip in
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • Scrapy 蜘蛛无法工作

    由于到目前为止没有任何效果 我开始了一个新项目 python scrapy ctl py startproject Nu 我完全按照教程操作 创建了文件夹和一个新的蜘蛛 from scrapy contrib spiders import
  • 如何识别图形线条

    我有以下格式的路径的 x y 数据 示例仅用于说明 seq p1 p2 0 20 2 3 1 20 2 4 2 20 4 4 3 22 5 5 4 22 5 6 5 23 6 2 6 23 6 3 7 23 6 4 每条路径都有多个点 它们
  • 使用 numpy 加速 for 循环

    下一个 for 循环如何使用 numpy 获得加速 我想这里可以使用一些奇特的索引技巧 但我不知道是哪一个 这里可以使用 einsum 吗 a 0 for i in range len b a numpy mean C d e f b i

随机推荐

  • pytorch Variable与Tensor合并后 requires_grad()默认与修改

    pytorch更新完后合并了Variable与Tensor torch Tensor 能像Variable一样进行反向传播的更新 返回值为Tensor Variable自动创建tensor 且返回值为Tensor 所以以后不需要再用Vari
  • 费曼学习法读后感

    目录 一 概述 二 全书主要内容 2 1 学习的本质 2 2 确立一个学习对象 2 3 理解我们要学习的知识 2 3 1 归类和对比知识的来源 2 3 1 1 将知识有逻辑的系统化 2 3 1 2 筛选和留下最可靠的知识 2 3 1 3 分
  • UOS启用wayland

    目录 系统wayland情况分析 后记 系统wayland情况分析 UOS默认启用的是x11 但是华为L410 L420这种麒麟芯片的机器 默认启用的是wayland 原因后面再推测 所以也想看看非麒麟平台如何能切换到wayland试试效果
  • [转]什么是边缘计算?

    转自 https blog csdn net gui951753 article details 80952907 注 本篇翻译自施巍松教授的论文 Edge Computing Vision and Challenges 目录 文章目录 摘
  • 工程代码_【OPPO手机进入工程模式】代码指令汇总

    来源 故乡往忆 首先要说的是 因为安卓系统版本不同 有的是安卓7 1有的是安卓8 1 因此即便都是vivo手机 可能在具体的代码指令上面 也会稍有不同 但是也都是大同小异 具体请自测 其次 工程模式是工程师测试使用的 若更改了工程模式下的设
  • BART原理简介与代码实战

    写在前面 最近huggingface的transformer库 增加了BART模型 Bart是该库中最早的Seq2Seq模型之一 在文本生成任务 例如摘要抽取方面达到了SOTA的结果 本次放出了三组不同的预训练权重 bart large 基
  • 通过STM32单片机控制直流电机实现位置速度电流PID三闭环,让电机精准控制!

    今天我们将会为大家带来一个非常实用的主题 那就是如何通过STM32单片机控制直流电机实现位置速度电流PID三闭环 让电机精准控制 首先 我们需要准备一台直流电机和一块STM32单片机开发板 接下来 我们将会通过C语言代码来实现PID三闭环控
  • HTTP 413错误解决方法

    环境 Ubuntu 16 04 nginx 1 5 6 通过post上传文件过大时 会出现413错误码 前端打开开发者模式 在输出台的位置会出现 Failed to load resource the server responded wi
  • 教你如何用VB做控件*.ocx

    教你如何用VB做控件 ocx 一个控件有很多事件如 Click MouseDown MouseUp MouseMove等 要触发这些事件都需要你加入代码 在控件的声明处加入Public Event Click 就表明该控件有一 Click
  • win7安装linux子系统,linux系统装win7系统安装教程【图文教程】

    说到linux系统可能很多人都不是特别的了解 因为在我们接触电脑用的最多的还是Windows系统 linux系统是一个基于POSIX多用户和多任务的一种CPU操作系统 但是一般人在选择的时候 还是会倾向于Windows系统 那么对于电脑安装
  • Linux下搭建zabbix的客户端,zabbix客户端linux下安装

    一 自定义安装zabbix agentd 临时目录 mkdir mnt tmp cd mnt tmp 下载zabbix管理程序 因为里面有我们要使用的客户端配置文件 建议单独保存 不然每次都下 可不好玩 wget http ncu dl s
  • 全球及中国航空发动机市场动态前景及十四五项目专项调研报告2021-2027年版

    全球及中国航空发动机市场动态前景及十四五项目专项调研报告2021 2027年版 HS HS HS HS HS HS HS HS HS HS HS HS HS HS 修订日期 2021年10月 搜索鸿晟信合研究院查看官网更多内容 第一章 航空
  • 使用LSTM进行预测,有一对一、多对一、多对多的预测,其中有一些疑问一起探讨(一)

    数据说明 我的数据是1万6千多的数据 想用4个特征 这个特征未加输出 预测2个输出 也就是多对多的预测 使用LSTM 一对一的预测 先用对一的预测简单一些 就是用一段时序数据取预测 代码例子看的MATLAB工具箱的例子 代码测试可行 大致看
  • 深入浅出MYSQL索引实现机制

    一 什么是索引 提到数据库索引 我想你并不陌生 在日常工作中会经常接触到 比如 我们的某一个SQL查询语句响应很慢 你可能第一反应是 给这个SQL 加个索引吧 那么到底什么是索引昵 今天我们就来聊一下这个话题 本文以MYSQL 5 6 为例
  • Redis使用总结(二、缓存和数据库双写一致性问题)

    首先 缓存由于其高并发和高性能的特性 已经在项目中被广泛使用 在读取缓存方面 大家没啥疑问 都是按照下图的流程来进行业务操作 但是在更新缓存方面 对于更新完数据库 是更新缓存呢 还是删除缓存 又或者是先删除缓存 再更新数据库 其实大家存在很
  • Flutter 升级2.5之后报错?

    Q Flutter执行命令升级新版本后 用flutter doctor命令检查时存在如下问题 按照提示键入命令后 再次出现报错 A 当我们升级SDK后 执行flutter doctor 这里是提示我们需要安装Android开发的命令行工具
  • iPhone/iPad用iTunes“同步”不等于“备份”

    一个很 基础 却很 重要 很多人 搞不清楚 解释又很花时间的问题 就是 iPhone 跟电脑 iTunes 同步 和 备份 有什么不同 首先 Sync 翻译成中文 同步 本来就是一个定义 认知有点模糊的中文动词 尤其对电脑不是很熟悉的朋友
  • Java 构造函数的详解

    我们人出生的时候 有些人一出生之后再起名字的 但是有些人一旦出生就已经起好名字的 那么我们在java里面怎么在对象一旦创建就赋值呢 1 构造方法的作用 构造方法作用 对对象进行初始化 如图 2 构造函数与普通函数的区别 1 一般函数是用于定
  • CTF工具压缩包爆破神器Fcrackzip详细用法

    Fcrackzip简介 Fcrackzip是一款专门破解zip类型压缩文件密码的工具 工具小巧方便 破解速度快 能使用字典和指定字符集破解 适用于linux mac osx 系统 Fcrackzip下载 Windows下载 下载链接 htt
  • 「爬虫教程」吐血整理,最详细的爬虫入门教程

    初识爬虫 学习爬虫之前 我们首先得了解什么是爬虫 来自于百度百科的解释 网络爬虫 又称为网页蜘蛛 网络机器人 在FOAF社区中间 更经常的称为网页追逐者 是一种按照一定的规则 自动地抓取万维网信息的程序或者脚本 通俗来讲 假如你需要互联网上