数据采集的基本知识

2.1 关于爬虫的合法性

几乎每个网站都有一个名为robots.txt的文档,当然也有部分网站没有设定robots.txt。对于没有设定robots.txt的网站,可以通过网络爬虫获取没有口令加密的数据,也就是该网站所有页面数据都可以被爬取。如果网站有robots.txt文档,就要判断是否有禁止访客获取的数据。

以某电商网站为例,该电商网站允许部分爬虫访问它的部分路径,而没有得到允许的用户,则全部禁止爬取,代码如下。

python 复制代码
headers = {

'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36'

}

Disallow:/

除了前面指定的爬虫外,不允许其他爬虫爬取任何数据。

2.2 认识网页结构

网页一般由三个部分组成,分别是HTML(超文本标记语言),CSS(层叠样式表)和JScript(活动脚本语言)。

1. HTML

HTML 是整个网页的结构,相当于真个网站的框架。带"<"">"符号的都属于HTML的标签,并且标签都是成对出现的。

常见的标签如下。

html 复制代码
<html>..</html>   表示标记中间的元素是网页
<body>..</body>   表示用户可见的内容
<div>..</div>     表示框架
<p>..</p>         表示段落
<li>..</li>       表示列表
<img>..</img>     表示图片
<h1>..</h1>       表示标题
<a href="">..</a> 表示超链接
2. CSS

CSS表示样式,<style type="text/css">表示将在下面引用一个CSS,并在CSS中定义了对应的样式。

3. JScript

JScript表示功能。交互的内容和各种特效都在JScript中,JScript描述了网站中的各种功能。

如果把网页比喻为人体,那么HTML是人的骨架,并且定义了人的嘴巴,眼睛,耳朵等要长在哪里;CSS表示人的外观细节,如嘴巴长什么样子,眼睛是双眼皮还是单眼皮,是大眼睛还是小眼睛,皮肤是黑色的还是白色的等;JScript表示人的技能,如跳舞,唱歌或演奏乐器等。

2.3 使用 requests 库请求网站

2.3.1 安装requests库

首先在PyCharm中安装requests库,安装命令如下:

python 复制代码
pip3 install requests
2.3.2 爬虫的基本原理
1. 网页请求的过程
(1) Request (请求)。

每个展示在用户面前的网页都必须经过这一步,也就是向服务器发送访问请求。

(2) Response(响应)。

服务器在接收到用户的请求后,会验证请求的有效性,然后向用户(客户端)发送响应的内容;客户端接收服务器响应的内容,将内容展示出来,这就是我们所熟悉的网页请求。

2. 网页请求的方式

(1) GET:最常见的方式,一般用于获取或查询资源信息,参数设置在URL中,其也是大多数网站使用的方式,只需一次发送和返回,响应速度快。

(2) POST:相比GET方式,POST方式通过request body 传递参数,可发送请求的信息远大于GET方式。

2.3.3 使用GET方式抓取数据
1. GET常见的参数

|---------|---------------------|------------------------------------------------------------------------------------------------------------------------------------|
| 参数 | 说明 | 实例 |
| url | 请求地址(必填) | ' http://www.netbian.com/ ' |
| params | URL 查询参数,字典或元组列表 | {'key':'value'} |
| headers | 请求头字典 | {' User-Agent:'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36' '} |
| cookies | Cookies字典或CookieJar | {'session':'abc123'} |
| timeout | 超时时间(秒) | 5或(3,27) |
| proxies | 代理设置 | {'http': 'http://proxy.com:8080'} |
| verify | SSL证书验证 | False |
| auth | 认证元组 | ('username', 'password') |

2. 小案例
python 复制代码
import requests

url = 'http://www.netbian.com/'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36'
}

response = requests.get(url,headers=headers)
response.encoding ='gbk'
soundCode = response.text
print(soundCode)

加载库使用的语句是 import +库的名称,在上述过程中,加载requests库的语句是 import requests。

用GET方式获取数据需要调用requests库中的get方法,使用方法是在requests后输入英文点号(.),如下所示。

python 复制代码
requests.get

将获取到的数据保存到response变量中,代码如下。

python 复制代码
response = requests.get(url,headers=headers)

这是response 是一个URL对象,它代表整个网页,但此时只需要网页中的源码,下面的语句表示网页源码。

python 复制代码
soundCode = response.text

**注意:**我选择哪个网页请求方式,不是我们自己决定的,而是我们根据网站的 Request Method的参数决定的 如上述网页图片所示。

2.3.4 使用POST方式抓取数据
1. POST常见的参数

|-------------------------------------|------------------------------------------------|---------------------|
| 参数 | 说明 | 使用场景 |
| url | 请求地址(必填) | - |
| data | 表单数据,字典/元组列表/字节 | 传统表单提交 |
| json | JSON数据,自动序列化并设置 Content-Type: application/json | REST API |
| files | 上传文件,字典 | 文件上传 |
| headers | 自定义请求头 | 设置Authorization 等 |
| cookies/timeout/proxies/verify/auth | 同GET | - |

2. 小案例
python 复制代码
import requests

url = 'https://588ku.com/photogram/meinv.html'
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36'
}

response = requests.post(url,headers=headers)
response.encoding ='utf-8'
soundCode = response.text
print(soundCode)

2.4 使用Beautiful Soup 解析网页

通过requests库已经抓取到网页源码,接下来从源码中找到并提取数据。BeautifulSoup是Python的一个库。其主要功能是从网页中抓取数据。Beautiful Soup目前已经被移植到bs4库中,也就是说在导入Beautiful Soup时需要先安装bs4库。

1. 安装bs4库
python 复制代码
pip install beautifulsoup4
pip install lxml
2. 创建BeautifulSoup对象
python 复制代码
import requests
from bs4 import BeautifulSoup

html_doc = """
<html>
<head><title>示例页面</title></head>
<body>
    <div class="content">
        <p id="intro">这是一个介绍</p>
        <a href="https://example.com">链接</a>
    </div>
</body>
</html>
"""

soup = BeautifulSoup(html_doc, 'lxml')  


with open('index.html', 'r', encoding='utf-8') as f:
    soup = BeautifulSoup(f, 'lxml')



response = requests.get('https://example.com')
soup = BeautifulSoup(response.text, 'lxml')
2.5 爬虫攻防

爬虫是模拟人的浏览访问行为,进行数据的批量爬取。当爬取的数据量逐渐增大时,会给被访问的服务器造成很大的压力,甚至有可能崩溃。换句话说就是,服务器是不喜欢有人抓取自己的数据的,那么,网站方面就会针对这些爬虫采取一些反爬策略。

服务器识别爬虫的一种方式是通过检查连接的User-Agent来识别到底是浏览器访问的还是代码访问的。如果是代码访问的,当访问量增大时,服务器就会直接封掉来访IP。在一个IP下批量访问,下载图片,这种行为不符合正常人类的行为,肯定要被封掉IP。不管如何访问,服务器的目的就是查出那些行为代码访问,然后封掉IP。解决方法:为避免被封掉IP,在数据采集时经常使用代理。当然,requests也是有相应的proxies属性。

首先构建自己的代码IP池,将其以字典的形式赋值给proxies,然后传输给requests。

python 复制代码
proxies = {
"http":"http://10.10.1.10:3128",
"https":"http://10.10.1.10:1080",
}
response = requests.get(url,proxies=proxies)
2.6 关于什么时候存储数据

数据存储一般发生在获取到网页的HTML或数据之后,未经过清洗和组织的数据是必须要保存的资料。保存好这些资料后,再写清洗和组织数据的脚本,将数据提取出来重新存入数据库或数据表中。

相关推荐
瑞思蕊萌2 小时前
Agent框架
python
坚持学习前端日记2 小时前
Agent AI 前端技术架构设计文档
前端·javascript·人工智能·python
威联通网络存储2 小时前
数据驱动精密智造:威联通 ZFS 存储架构的合规实践
python·架构
yaoxin5211232 小时前
350. Java IO API - Java 文件操作:java.io.File 与 java.nio.file 功能对比 - 2
java·python·nio
yaoxin5211232 小时前
351. Java IO API - Java 文件操作:java.io.File 与 java.nio.file 功能对比 - 3
java·python·nio
2301_761471392 小时前
day 46
python
所谓伊人,在水一方3332 小时前
【机器学习精通】第2章 | 优化算法深度解析:从梯度下降到自适应优化器
人工智能·python·算法·机器学习·信息可视化
Jackson@ML2 小时前
2026最新版Anaconda Navigator for Mac安装使用指南
python·macos·anaconda
Storynone2 小时前
【Day24】LeetCode:122. 买卖股票的最佳时机 II,55. 跳跃游戏,45. 跳跃游戏II,1005. K次取反后最大化的数组和
python·算法·leetcode