爬虫系列之基础篇一: 初识爬虫
数据时代,用较低的成本获取想要的数据,然后将之整合消化,不失为一种生存之道。
目录
1 爬虫是什么
1.1 爬虫定义
网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。简单说:就是用事先写好的程序去抓取网络上所需的数据,这样的程序就叫网络爬虫。编写网络爬虫的程序员叫做爬虫工程师。
1.2 爬虫分类
根据使用场景,网络爬虫可分为通用爬虫和聚焦爬虫两种。
- 通用爬虫
捜索引擎抓取系统的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
·什么是搜索引擎?
搜索引擎(Search Engine)是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。
通用网络爬虫的作用:
从互联网中搜集网页,采集信息,这些网页信息用于为搜索引擎建立索引从而提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时。 - 聚焦爬虫
聚焦爬虫,是"面向特定主题需求"的一种网络爬虫程序,它与通用搜索引擎爬虫的区别在于:**聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息。**而我们关注和学习的,就是聚焦爬虫。
2 爬虫进阶之路
2.1 初级
- WEB前端知识:HTML、CSS、JavaScript、DOM、HTML、Ajax、JQuery、Json等
- 正则、Xpath、selenium、requests等模块使用
- 深度优先和广度优先抓取算法实现及使用
- 熟悉HTTP和HTTPS协议的基础知识,了解GET和POST方法,了解HTTP头中的信息,包括返回状态码、编码、UA、Cookie和Session等
2.2 中级
- IP被阻断时,会使用代理
- 抓包工具Fiddler等简单使用,会分析Ajax请求,能做一些不那么困难的模拟登录
- selenium高级用法、简单JS逆向
- 并发,多线程爬虫的使用,对Scrapy等开源框架有一定深度的认识
2.3 高级
- 能进行各种不同网页的验证码破解
- 能破解网站的数据加密
- Redis/MongoDB数据缓存系统搭建
- 分布式爬虫系统、增量爬虫
- APP抓包、复杂JS逆向
3 requests库简介
Requests模块是发起http请求最常见的模块,也是爬虫爱好者最常用的包之一。继承了urllib的所有特性。Requests支持http连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的URL和POST数据自动编码。关键是文档完备,教程众多。
3.1 文档地址
- 开源地址:requests
- 中文文档:requests中文
3.2 安装
pip install requests
3.3 requests之get请求
http最常用的请求之一,绝大多数情况下被用来从服务器获取内容,而post则常用来向服务器提交数据。
案例一:一页html到本地
# -*- coding: UTF-8 -*-
import requests
# 发起请求
response = requests.get(url="https://www.baidu.com/more/")
response.encoding = 'utf-8'
# 保存页面
with open("result.html", 'w+', encoding='utf-8') as f:
f.write(response.content.decode())
案例二:保存多页html到本地
# -*- coding: UTF-8 -*-
import requests
# 请求参数
params = {}
# 请求头
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh;q=0.9',
'cookie': 'BAIDU_SSP_lcr=https://www.baidu.com/link?url=qTr1SeIsm2Cv5NW4ILcjrCmjLnSZLExM6A4CXjI3kXD02hAROxxg3Ovj6-1nH8X5&wd=&eqid=94f842c100000cf60000000461528509; smidV2=20210928105500810d6da3cc55adf32d980e21872c9a32003aedb70c35d0790; app_cookie=1632798171; __dacevid3=0x4c32fd06c3da7f8c; __dacemvst=1b5b2c33.7bdd61f3; Hm_lvt_ac423772552f47d0bb3ae6d55e13262c=1632798172,1632798185; Hm_lpvt_ac423772552f47d0bb3ae6d55e13262c=1632798185; __dacemvst=1b5b2c33.7bdd61f3|1632799999878',
'referer': 'https://m.hupu.com/nba/news',
'sec-ch-ua': '"Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'sec-fetch-dest': 'document',
'sec-fetch-mode': 'navigate',
'sec-fetch-site': 'same-origin',
'sec-fetch-user': '?1',
'upgrade-insecure-requests': '1',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'
}
# 发起请求
for page in range(1, 6):
response = requests.get(url="https://m.hupu.com/nba/news/{}".format(page), headers=headers)
# 保存文件
print(response.text)
with open("./本地镜像/" + "第" + str(page) + "页.html", 'w+', encoding='utf-8') as f:
f.write(response.text)
请求头怎么找: F12->network->找到你要的内容->再点击headers就看到了。
3.4 requests之post请求
http最常用的请求之一,绝大多数情况下被用来用来向服务器提交数据,获取服务器的某种响应。
案例一:手动版英汉互译
# 获取用户输入
kw = input("请输入单词:")
# 定义参数字典
data = {
'kw': kw
}
# 定义请求头
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
# 发起请求
response = requests.post(
url="https://fanyi.baidu.com/sug",
data=data,
headers=headers
)
# 获取数据
trans = response.json()["data"]
for item in trans:
for k, v in item.items():
print(v)
4 爬虫之风险
- 以不抓取、不贩卖个人信息及组织企业重要敏感信息为底线。
- 公开免费的信息,不进行违法操作,比如造假、诽谤等。
- 信息是公开的,但信息本身具有较高的商业价值,能够给使用者带来商业利益,此时的爬虫也违法。
- 未经平台授权,强行突破反爬措施,导致被爬网站的运行受到严重影响,违法。
- 经用户同意搜集用户个人信息的,应当明确告知搜集和处理用户个人信息的方式、内容和用途,不得收集其提供服务所必需以外的信息,不得将用户个人信息用于其提供服务之外的目的。
- 网络运营者不得泄露、篡改、毁损其收集的个人信息,未经被收集者同意,不得向他人提供个人信息,但经过处理无法识别特定个人且不能复原的除外。
以上。