【爬虫系列】Python 爬虫入门(1)

news2024/11/27 0:34:25

爬虫说明

我们知道,互联网时代,大量的数据信息会以网页作为载体而存在,有些公开而免费的数据比较适合采集,并经过有效处理之后,可用于数据分析、机器学习、科学决策等方面,而从网页中采集数据的利器,当属爬虫了。爬虫的定义也很好理解:指按照一定的规则自动地从网页上抓取数据的代码或脚本,它能模拟浏览器对存储指定网页的服务器发起请求,从而获得网页的源代码,再从源代码中提取需要的数据。

利用爬虫技术获取数据,具有持续性、稳定性、效率高等优势。接下来,将梳理有关爬虫的入门知识点,并把实践中遇到的问题也记录下。

入门爬虫的话,建议选择 requests + BeautifulSoup 模块。requests 模块是一个简单而优雅的 HTTP 库,用于处理请求和响应的,通常得到响应的数据大多数都是 HTML 文档形式,可使用 BeautifulSoup 模块解析 HTML 文档并提取其中想要的数据。

首先,通过 pip 命令下载依赖:

pip install requests
pip install beautifulsoup4

1、请求头检查(User-Agent)

通常情况下,网站都会开启反爬虫机制的,其中最简单且最常见的一种策略是检查 User-Agent,网站会检查是否存在请求头信息。如果不存在的话,说明不是通过浏览器访问的,会被当做爬虫程序被拒绝请求。解决的方法也很简单,就是在代码里加入 User-Agent 呗,然而不同的浏览器的User-Agent是不同的,如果我们每次都去找浏览器的 User-Agent 并手动加入代码中,这显然很费劲!

推荐一个用于随机生成请求头的库 fake-useragent,名字看上去很霸气,也超级好用!编写一段测试代码,测试不同浏览器的 User-Agent 内容,如下:

from fake_useragent import UserAgent

ua = UserAgent()
print(f"firefox: {ua.firefox}")
print(f"chrome: {ua.chrome}")
print(f"google: {ua.google}")
print(f"IE: {ua['Internet Explorer']}")

记得去年使用的时候,可以直接拿来用,而最近使用却老是报错,报错信息如下:

废了半天的劲,终于解决了,在ua对象的参数 path 里加入一个 JSON 文件,通过这个 JSON 文件匹配不同浏览器的 User-Agent,该文件可以去这里下载,重新测试,完美解决:

2、请求目标 URL(requests API)

在正式开启爬虫之前,我们需要了解熟悉下 requests 模块相关的 API。

这里,以新安人才网的 Java 开发工程师招聘的网页作为目标 URL 为例,进行热身练习。当以 get 方式请求网页数据后,如果响应的状态返回200或 reason 返回 OK,就能判断获取网页数据成功,从而进一步可拿到响应内容或整个 HTML 文档,为后续的网页解析做好准备,如下:

import requests


url = 'https://search.goodjobs.cn/index.php'
# 以get方式发送请求,暂时不加入请求头
response = requests.get(url)

print(response.reason)  # 请求成功的话,返回OK
print(response.status_code)  # 请求成功的话,返回200
print(response.headers.items())  # 获取请求头信息
print(response.cookies)  # 获取cookies信息
print(response.encoding)  # 获取编码方式
print(response.content)  # 响应内容
print(response.text)  # 返回整个HTML网页文档

当然,我们也可以选择其他的请求方式,比如 POST、PUT、DELTET、HEAD、OPTIONS 等,而最常用的请求方式则是 GET 和 POST 了。需要注意的是,GET 方式还支持传入请求参数 params,请求头 headers 等,如下:

import requests
from fake_useragent import UserAgent


#完整url:https://search.goodjobs.cn/index.php?metro=0&area=0&page=1
url = 'https://search.goodjobs.cn/index.php'
# 请求参数
params = {'metro':0, 'area':0, page=1}
# 请求头
path = 'D:\\XXX\\reptile\\fake_useragent.json'
headers = UserAgent(path).google
#构建请求
res = requests.get(url. params, headers)

3、解析网页数据(BeautifulSoup)

requests 模块负责向目标url发送请求,并返回响应数据,接着就是如何处理响应数据了。如果从响应得到的数据是Json格式的话,那最好不过了,直接存入文件或数据库中即可。通常情况下,得到的是 HTML 文档,那就需要考虑如何去解析它了。解析和提取目标网页数据的话,可以使用正则表达式,也可以使用 BeautifulSoup 模块。

这里,以 BeautifulSoup 模块为例说明,相关的 API 可以了解一下:

from bs4 import BeautifulSoup


soup = BeautifulSoup(respone.text, "html.parser") #返回整个HTML文档对象

# HTML文档的遍历
soup.div  #获取所有的div
soup.div.p #获取所有的div下的p标签
soup.div.p.name #获取所有的div下的p标签的名称
soup.div.p['id']#获取所有的div下的p标签的id属性

'''
  HTML文档的搜索:有两种方法find_all()、find()
    find_all():返回所有匹配到的标签
    find():返回匹配到的第一个标签
'''
soup.find_all('div') #获取所有的div标签
soup.find_all("p", class_="aaa") #获取class属性为aaa的p标签
soup.find_all(id='203568110') #搜索id='203568110'标签

# get_text():获取文本内容,返回的是 unicode 类型的字符串
soup.find_all('div').get_text()

通过 CSS 选择器的定位方式,测试一下:

import requests
from bs4 import BeautifulSoup

# 以get方式发送请求,暂时不加入请求头
response = requests.get(url)
if response.status_code == 200:
    # 返回整个HTML文档对象
    soup = BeautifulSoup(response.text, "html.parser")
    # 获取职位列表(提取招聘公司名称)
    jobList = []
    jobDivList = soup.find_all('div', class_='border-b clearfix ml16 mr20 h130 sear-job relative jshandle_jobShowDetailParent')
    for i in range(0, len(jobDivList)):
        company = soup.select("div[class='fr']>a")[i].get_text().strip().split('   ')
        jobList.append(company)
    print(jobList)

爬取到的结果,如下:

可以看到,使用 BeautifulSoup 模块解析和提取 HTML 文档包含的数据,重点在于对网页结构的了解和分析。我在刚开始接触的时候,通过 BeautifulSoup 模块解析 HTML 文档是一个很麻烦的过程,如果不使用 CSS 选择器操作的话,通过 xpath 屡试屡错让人抓狂啊,期间还遇到很多的语法书写错误。

BeautifulSoup 模块提供了 select() 方法获取 CSS 选择器定位到的标签结果,如果想要获取标签内容,继续使用 get_text() 方法,这极大的方便对网页的解析操作,语法学习也不是太难,建议采用 CSS 选择器。

4、CSS 选择器

CSS,即层叠样式表(Cascading Style Sheets)的简称,是一种负责页面美化和布局控制的语言,它有很多类型的选择器,比如id选择器,class选择器,元素选择器等。有时候爬虫需要去解析HTML文档,为提升效率,掌握CSS选择器的用法,对定位到想要的数据很有帮助。

接下来,以下面这段 HTML 标签为例:

<div id='ddd'>
   <span id="kkk" class="f618 sp0 m0" name="wxx1">你真棒!!!</span>
   <span id="kzz" class="f618 sp0 m0" name="wxx2">你真好棒!!!</span>
</div>

在整个HTML文档中要定位到 span 标签的位置的话,可以使用元素选择器:(所有span标签)

span

可以使用id选择器:(唯一)

#kkk

可以使用 class 选择器:(div标签下的类属性为f618 sp0 m0的所有span标签)

.f618 sp0 m0

可以使用相邻选择器:(id 为kkk的 span 标签的下一个相邻span标签)

#kkk+span

可以使用子选择器:(div标签下的所有span标签)

div>span

可以使用包含选择器:(div标签下的所有span标签)

div span

可以使用全局选择器:(div标签下的所有标签)

div *

可以使用群选择器:(div标签下的指定span标签)

div #kkk,#kzz

可以用属性选择器:(指定属性的span标签)

span[name='wxx1'] 
span[class='f618 sp0 m0']

可以使用伪选择器:(对列表类型更实用~)

  • id为ddd的div标签下的第一个span标签:

div#ddd > span:nth-child(1)
div#ddd > span:frist-child
  • id为ddd的div标签下的最后一个span标签:

div#ddd > span:nth-last-child(1)
div#ddd > span:last-child
  • 取反:例如不选择第一个span标签:

div#ddd > span:not(1)

在上面的基础知识点掌握之后,就可以根据自己的需求拼接解析表达式了,如下:

soup = BeautifulSoup(text, "html.parser")

#获取第一个span标签内容,可以写:
soup.select("div > span[name='wxx1']").get_text()
#也可以写:
soup.select("div > span:frist-child").get_text()
#也可以写:
soup.select("div > span:nth-child(1)").get_text()
#也可以写:
soup.select("div #kkk").get_text()

最后

基于 Python 的爬虫入门看起来并不难,选择 requests + BeautifulSoup 模块入门基本就够了。而实际中的爬虫技术远没有这么简单了,需要学习和掌握的还有很多知识,比如,解析更复杂的 HTML 文档:从嵌套更为复杂的页面提取出目标数据,从动态网页提取目标数据等;反爬虫机制:有哪些常见反爬类型,又如何绕开网站反爬虫的防御呢;常见的爬虫框架有哪些,都有哪些优点和特色等等。

此外,我们需要清醒的认识到,爬虫技术是把双刃剑,用的好可以提升效率,用途不好牢饭管饱,近些年来触犯底线的新闻事件时有发生,以至于提及到爬虫,总会给人一种不太好的印象啊!!因此,正确认识爬虫技术,正确使用爬虫技术,我们应该拥有这样的认识观~~

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

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

相关文章

<学习笔记>从零开始自学Python-之-web应用框架Django( 八)Django表单

HTML 表单是交互式网站的基本组成部分&#xff0c;用户提交信息、搜索内容、与后台数据交互都要用到表单。 1、从请求对象中获取数据 view视图函数的第一个参数都是 request,这个request就是请求获得的HttpRequest对象。里面包含中有一些关于当前所请求 URL 的信息&#xff0c…

MySQL中SQL命令语句条件查询

一、聚合函数 聚合函数&#xff1a;又叫组函数&#xff0c;用来对表中的数据进行统计和计算&#xff0c;结合group by分组使用&#xff0c;用于统计和计算分组数据 常用聚合函数 count(col)&#xff1a;求指定列的总行数max(col)&#xff1a;求指定列的最大值min(col)&#…

SnowNLP使用自定义语料进行模型训练(情感分析)

SnowNLP SnowNLP是一个功能强大的中文文本处理库&#xff0c;它囊括了中文分词、词性标注、情感分析、文本分类、关键字/摘要提取、TF/IDF、文本相似度等诸多功能&#xff0c;像隐马尔科夫模型、朴素贝叶斯、TextRank等算法均在这个库中有对应的应用。如果大家仔细观察过博主的…

nodejs的下载安装

1.从官网下载nodejs 官网地址如下 Download | Node.js 选择老版本的node防止出现兼容问题 根据电脑下载64位或者32位的 2.安装node 配置环境变量&#xff0c;nodejs安装完成后&#xff0c;会默认在系统path环境变量中配置node.exe的路径&#xff0c;打开cmd&#xff0c;输入n…

Java实现DFA算法进行敏感词过滤

一、敏感词过滤数据文件 https://github.com/jkiss/sensitive-words 代码图数据文件如下&#xff1a; 二、敏感词实现原理基于二叉树排序 首先&#xff1a;query 日 ---> {本}、query 本 --->{人、鬼子}、query 人 --->{null}、query 鬼 ---> {子}。形如下结构&…

见微知著,从两道有意思的 CSS 面试题,考察你的基础

今天在论坛&#xff0c;有看到这样一道非常有意思的题目&#xff0c;简单的代码如下&#xff1a; <div><p id"a">First Paragraph</p> </div> 样式如下&#xff1a; p#a {color: green; } div::first-line {color: blue; } 试问&#xff0…

手写笔记教会你集成Spring和Mybatis框架(有详细注解)

目录 1. 为什么要将框架进行集成呢&#xff1f; 2. 框架的集成有什么好处&#xff1f; 3. Spring框架与Mybatis框架的集成 3.1 步骤一&#xff1a; 3.2 步骤二 3.3 Spring的配置文件&#xff1a; 3.4 Mybatis的配置文件&#xff1a; 4. 总结 1. 为什么要将框架进行集成…

基于51单片机智能恒温箱控制系统Proteus仿真

资料编号&#xff1a;153 下面是相关功能视频演示&#xff1a; 153-基于51单片机智能恒温箱控制系统Proteus仿真(源码仿真全套资料)功能介绍&#xff1a; 采用51单片机作为控制CPU&#xff0c;ds18b20作为温度传感器采集温度&#xff0c;LCD1602显示当前温度&#xff0c;采用…

【Yarn】spark/flink 作业的executor内存参数和Yarn web ui 显示不一致问题

前言 最近在做 CDH -> CDP 的迁移&#xff0c;Yarn迁移完成后&#xff0c;发现在spark/flink 作业的executor内存参数和Yarn web ui 显示申请的内存不一致。 例如&#xff1a;一个 spark 任务申请了 10个 executor&#xff0c;每个executor 内存为 1G&#xff0c;driver内…

董秋仙-1-函数极限连续-2

目录 利用单调有界原理求数列收敛&#xff0c;主要分为两步 利用切线放缩和定积分放缩 拆成两个调和级数相减拉链定理 使用诱导公式转化为可以使用等价无穷小的情形 无穷区间零点定理的取点 证明数列收敛有四种方法 证明调和级数发散的方法 利用单调有界原理求数列收敛&…

Docker专题(五)之 端口映射与容器互联

文章目录一、端口映射实现容器访问1.1 从外部访问容器的应用1.2 映射所有接口的地址1.3 映射到指定地址的指定端口1.4 映射到指定地址的任意端口1.5 查看映射端口配置二、互联机制实现便捷访问2.1自定义容器命名2.2 容器互联Docker除了通过网络来访问外&#xff0c;还提供了两个…

网络是怎样连接的--探索协议栈和网卡

“如果一生只有一次翻身的机会&#xff0c;那就用尽全力吧。” 文章目录1.创建套接字1.1 协议栈的内部结构1.2 套接字的实体就是通信控制信息1.3 调用socket时的操作2.连接服务器2.1连接含义2.2 负责保存控制信息的头部2.3 连接操作的实际过程3.收发数据3.1将http请求消息交给协…

JavaScript | 1000个判断条件难道要写了1000个 if ? 一文教你如何实现分支优化

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;大三学生&#xff0c;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&am…

K线形态识别_身怀六甲和十字胎

写在前面&#xff1a; 1. 本文中提到的“K线形态查看工具”的具体使用操作请查看该博文&#xff1b; 2. K线形体所处背景&#xff0c;诸如处在上升趋势、下降趋势、盘整等&#xff0c;背景内容在K线形态策略代码中没有体现&#xff1b; 3. 文中知识内容来自书籍《K线技术分析》…

双非本计算机从零开始三年努力能做到什么程度【学习路线回顾总结问答】

文章目录前言一、回顾大学1.1 大一上1.1.1 第一个学期1.1.2 第一个寒假1.2 大一下1.2.1 第二个学期1.2.2 第一个暑假1.3 大二上1.3.1 第三个学期1.3.2 第二个寒假1.4 大二下1.4.1 第四个学期1.4.2 第二个暑假1.5 大三上1.5.1 第五个学期1.5.2 第三个寒假1.6 大三下1.6.1 第六个…

3.1 机器学习 --- 决策树

3.1 机器学习 — 决策树 一 金融评分卡 模型做好后尽量快的上线&#xff0c;以符合要求的模型&#xff0c;尽快上线。超参数赋予权重&#xff0c;使得模型的参数不一致&#xff0c;而达到均衡样本数据 二 决策树原理 1. 找女朋友 性别&#xff1a;男 女年龄&#xff1a;20…

二叉树跟前缀、中缀、后缀表达式

目录 一.概念 二.跟二叉树的联系 前序遍历&#xff08;先根遍历&#xff09; 中序遍历&#xff08;中根遍历&#xff09; 后序遍历&#xff08;后根遍历&#xff09; 二叉树例题 三.知二求一并还原二叉树 已知前序遍历和中序遍历 例题 解答 已知中序遍历和后序遍历 …

【双十一特辑】爱心代码(程序员的浪漫)

个人主页&#xff1a;天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 目录 前言 C语言简易爱心代码 原理 代码 执行结果 C语言动态爱心代码 涉及知识点 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),字体色) sheep() 代码 执行结果 Python简易爱…

c++数据结构第六周(图),深搜、广搜(stl版)

本方法皆用vector进行邻接表模拟 7-1 图的先深搜索 作者 唐艳琴 单位 中国人民解放军陆军工程大学 输出无向图的给定起点的先深序列。 输入格式: 输入第一行给出三个正整数&#xff0c;分别表示无向图的节点数N&#xff08;1<N≤10&#xff09;、边数M&#xff08;≤50&a…

CentOS7.x部署GreenPlum6.x

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、GreenPlum是什么&#xff1f;二、使用步骤1.环境说明2.集群介绍3.修改主机名(root)4.网络映射(root)5.创建安装目录6.安装部署7.SSH (免密登录)8.环境配置9.…