Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【爬虫教程】最详细的爬虫入门教程~

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

作者头像
Awesome_Tang
发布于 2019-11-27 16:19:16
发布于 2019-11-27 16:19:16
13.2K00
代码可运行
举报
文章被收录于专栏:FSocietyFSociety
运行总次数:0
代码可运行

初识爬虫

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

网络爬虫(又称为网页蜘蛛,网络机器人,在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

requests应该是用Python写爬虫用到最多的库了,同时requests也是目前Github上star✨最多的Python开源项目。 requests在爬虫中一般用于来处理网络请求,接下来会用通过简单的示例来展示requests的基本用法。

  1. 首先我们需要倒入requests模块;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
  1. 接着我们尝试向baidu发起请求;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
r = requests.get('https://www.baidu.com/')
  1. 我们现在获得来命名为r的response对象,从这个对象中我们便可以获取到很多信息,如:
  2. 状态码,200即为请求成功
  3. 页面Html5代码
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 返回请求状态码,200即为请求成功
print(r.status_code)

# 返回页面代码
print(r.text)

# 对于特定类型请求,如Ajax请求返回的json数据
print(r.json())
  1. 当然对于大部分网站都会需要你表明你的身份,我们一般正常访问网站都会附带一个请求头(headers)信息,里面包含了你的浏览器,编码等内容,网站会通过这部分信息来判断你的身份,所以我们一般写爬虫也加上一个headers
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加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)
  1. 针对post请求,也是一样简单;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 添加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)
  1. 很多时候等于需要登录的站点我们可能需要保持一个会话,不然每次请求都先登录一遍效率太低,在requests里面一样很简单;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 保持会话
# 新建一个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图片的话便可以通过divclass=index-logo-srcnew来进行定位。

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

  1. 导入beautifulsou模块;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from bs4 import BeautifulSoup
  1. 对页面代码进行解析,这边选用对html代码是官方示例中使用的爱丽丝页面代码;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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')
  1. 我们现在获得一个命名为soupBeautifulsoup对象,从这个对象中我们便能定位出我们想要的信息,如:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 获取标题
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'))

打印结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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. 记住此时的标签以及熟悉等信息,这将会用于后面解析筛选数据。

  • 接下来便可以开始敲代码了,完整代码如下,对于每个步骤均有详细的注释:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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数据,不需要我们去写复杂的表达式去解析了。 接下来我们将会通过一个拉勾网职位信息的爬虫来说明这类网站的爬取流程:

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

  1. 然后我们切换到headers标签下,我们可以看到请求的地址和所需到参数等信息;

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

  • 代码如下,也很简单,不过三十几行:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)
  • 附上执行结果:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
数据分析-客服中心(J10558) 哈啰出行 3-5年 9k-15k
大数据分析师 建信金科 3-5年 16k-30k
......
数据分析师-【快影】 快手 3-5年 15k-30k
数据分析师(业务分析)-【商业化】 快手 3-5年 20k-40k
数据分析师 思创客 1-3年 6k-12k

全文完~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python︱HTML网页解析BeautifulSoup学习笔记
一、载入html页面信息 一种是网站在线的网页、一种是下载下来的静态网页。 1、在线网页 参考《python用BeautifulSoup库简单爬虫入门+案例(爬取妹子图)》中的载入内容: import
悟乙己
2018/01/02
3.3K0
二、爬虫基础库
request模块 安装 1 pip install requests 简单使用   import requests response=requests.get("https://movie.douban.com/cinema/nowplaying/beijing/") print(response.content) # 字节数据 print(response.text) # 字符数据 print(type(response)) # <class '
用户1214487
2018/01/24
1.8K0
二、爬虫基础库
专栏:005:Beautiful Soup 的使用
系列爬虫专栏 崇尚的学习思维是:输入,输出平衡,且平衡点不断攀升。 曾经有大神告诫说:没事别瞎写文章;所以,很认真的写的是能力范围内的,看客要是看不懂,不是你的问题,问题在我,得持续输入,
谢伟
2018/06/06
6850
Python爬虫:我这有美味的汤,你喝吗
在前面的文章中已经讲过了正则表达式的使用方法了,但是如果正则表达式出现问题,那么得到的结果就不是我们想要的内容。熟悉前端的朋友肯定知道,对于一个网页来说,都有一定的特殊结构和层级关系,而且很多节点都用id和class来区分。所以可以借助网页的结构和属性来提取数据。
我被狗咬了
2021/01/13
2.5K0
Python爬虫:我这有美味的汤,你喝吗
使用python多进程爬取高清美图
当我们打开一个网页,在上面发现一些了有用的信息之后,于是通过人工的方式从网页上一顿操作将信息记录起来,而通过爬虫,则可以利用一些设定好的规则以及方法来自动的从该网页上获取信息,总而言之就是解放双手,释放天性。
dogfei
2021/08/08
1K0
使用python多进程爬取高清美图
python中request请求库与BeautifulSoup解析库的用法
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.
GeekLiHua
2025/01/21
1780
python中request请求库与BeautifulSoup解析库的用法
​Python 操作BeautifulSoup4
BeautifulSoup4是爬虫里面需要掌握的一个必备库,通过这个库,将使我们通过requests请求的页面解析变得简单无比,再也不用通过绞尽脑汁的去想如何正则该如何匹配内容了。(一入正则深似海虽然它使用起来效率很高效哈)
度假的小鱼
2023/11/18
4240
​Python 操作BeautifulSoup4
python爬虫系列三:html解析大法
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。 它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。 在爬虫开发中主要用的是
py3study
2020/01/03
8550
python爬虫系列三:html解析大法
Python 爬虫之网页解析库 BeautifulSoup
BeautifulSoup 是一个使用灵活方便、执行速度快、支持多种解析器的网页解析库,可以让你无需编写正则表达式也能从 html 和 xml 中提取数据。BeautifulSoup 不仅支持 Python 内置的 Html 解析器,还支持 lxml、html5lib 等第三方解析器。
keinYe
2019/08/01
1.3K0
网络爬虫 | Beautiful Soup解析数据模块
从HTML文件中提取数据,除了使用XPath,另一种比较常用的解析数据模块。Beautiful Soup模块中查找提取功能非常强大、方便,且提供一些简单的函数来导航、搜索、修改分析树等功能。Beautiful Soup模块是Python的一个HTML解析库,借助网页的结构和属性来解析网页(比正则表达式简单、有效)。Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。
数据STUDIO
2021/06/24
6270
Python爬虫--- 1.2 BS4库的安装与使用
Beautiful Soup 库一般被称为bs4库,支持Python3,是我们写爬虫非常好的第三方库。因用起来十分的简便流畅。所以也被人叫做“美味汤”。目前bs4库的最新版本是4.60。下文会介绍该库的最基本的使用,具体详细的细节还是要看:官方文档 bs4库的安装 Python的强大之处就在于他作为一个开源的语言,有着许多的开发者为之开发第三方库,这样我们开发者在想要实现某一个功能的时候,只要专心实现特定的功能,其他细节与基础的部分都可以交给库来做。bs4库 就是我们写爬虫强有力的帮手。 安装的方式
緣來
2018/09/18
9370
Python爬虫--- 1.2 BS4库的安装与使用
Python爬虫扩展库BeautifulSoup4用法精要
BeautifulSoup是一个非常优秀的Python扩展库,可以用来从HTML或XML文件中提取我们感兴趣的数据,并且允许指定使用不同的解析器。由于beautifulsoup3已经不再继续维护,因此新的项目中应使用beautifulsoup4,目前最新版本是4.5.0,可以使用pip install beautifulsoup4直接进行安装,安装之后应使用from bs4 import BeautifulSoup导入并使用。下面我们就一起来简单看一下BeautifulSoup4的强大功能,更加详细完整的学
Python小屋屋主
2018/04/16
7850
Python爬虫--- 1.3 BS4库的解析器
bs4库官方推荐我们使用的是lxml解析器,原因是它具有更高的效率,所以我们也将采用lxml解析器。
緣來
2018/09/18
8410
python 爬虫利器优美的Beauti
    近期在研究py的网络编程,编写爬虫也是顺利成章的,开始在纠结与用正则表达式来匹配,到后来发现了Beautifulsoup,用他可以非常完美的帮我完成了这些任务:
py3study
2020/01/08
4350
​Python爬虫--- 1.3 BS4库的解析器
原文链接https://www.fkomm.cn/article/2018/7/20/18.html
圆方圆PYTHON学院
2018/12/17
9070
网络爬虫部分应掌握的重要知识点
Web 服务是互联网提供的 World wide Web 服务的简称,最简单的 Web 服务是如下的2层体系结构:
Francek Chen
2025/01/22
1040
网络爬虫部分应掌握的重要知识点
python爬虫之BeautifulSoup
文章目录 1. python爬虫之BeautifulSoup 1.1. 简介 1.2. 安装 1.3. 创建BeautifulSoup对象 1.4. Tag 1.4.1. 注意: 1.4.2. get 1.4.3. string 1.4.4. get_text() 1.5. 搜索文档树 1.5.1. find_all( name , attrs , recursive , text , **kwargs ) 1.5.2. find( name , attrs , recursive , text , *
爱撒谎的男孩
2019/12/31
9970
Python爬虫之BeautifulSoup解析之路
上一篇分享了正则表达式的使用,相信大家对正则也已经有了一定的了解。它可以针对任意字符串做任何的匹配并提取所需信息。
Python数据科学
2018/08/06
1.9K0
Python爬虫之BeautifulSoup解析之路
Python爬虫(十四)_BeautifulSoup4 解析器
CSS选择器:BeautifulSoup4 和lxml一样,Beautiful Soup也是一个HTML/XML的解析器,主要的功能也是如何解析和提取HTML/XML数据。 lxml只会局部遍历,而Beautiful Soup是基于HTML DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。 BeautifulSoup用来解析HTML比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持lxml的XML解析器。 Bea
用户1174963
2018/01/17
8680
Python爬虫(十四)_BeautifulSoup4 解析器
python爬虫(三)数据解析,使用bs4工具
和 lxml 一样,Beautiful Soup 也是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数据。 lxml 只会局部遍历,而Beautiful Soup 是基于HTML DOM(Document Object Model)的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多,所以性能要低于lxml。 BeautifulSoup 用来解析 HTML 比较简单,API非常人性化,支持CSS选择器、Python标准库中的HTML解析器,也支持 lxml 的 XML解析器。 Beautiful Soup 3 目前已经停止开发,推荐现在的项目使用Beautiful Soup 4。
一写代码就开心
2022/06/06
9480
python爬虫(三)数据解析,使用bs4工具
相关推荐
python︱HTML网页解析BeautifulSoup学习笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验