Python写网络爬虫(一)


首先,在学习网络爬虫之前,需要先了解它是什么!

网络爬虫简介

网络爬虫:web crawler(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

上面这些都是百度百科晦涩难懂的官话,用我们自己的话来说,
爬虫就是:通过我们自己编写的程序,模拟浏览器上网,然后让其去互联网抓取我们想要的数据的过程。

爬虫在使用场景中的分类

  1. 通用爬虫:
    抓取系统的重要组成部分。即抓取互联网中一整张页面数据。
  2. 聚焦爬虫:
    建立在通用爬虫的基础之上。抓取的是页面中特定的局部内容。
    PS:先用通用爬虫爬取一整张页面信息,再用聚焦爬虫抓取局部内容。
  3. 增量式爬虫:
    检测网站中数据更新的情况。即只会抓取网站中最新更新出来的数据。

爬虫的矛与盾

  • 反爬机制(盾):
    门户网站可以通过制订相应的策略和技术手段,防止爬虫程序进行网站数据的爬取。
  • 反反爬机制(矛):
    爬虫程序可以制订相关的策略和技术手段,破解门户网站中具备的反爬机制,从而可以获取门户网站中相关的数据。

需要知道的协议

  • robots.txt协议:
    君子协议。规定了网站中哪些数据可以被爬虫爬取,哪些不能。
    (额 但实际上想爬就爬了,拦不住。但人要有道德!,也要谨防进橘子)

    这个是某网站的robots.txt协议的规定
    在这里插入图片描述

  • http协议:
    通俗来说就是 服务器和客户端进行数据交互的一种形式

  • https协议:
    简单说就是 安全的http(超文本传输)协议

常用请求头信息

  • User-Agent:
    请求载体的身份标识
    (请求载体:当前浏览器;身份标识:操作系统版本,当前浏览器版本等信息)
    User-Agent

  • Connection:请求完毕后,是断开连接(close)还是保持连接(keep-alive)在这里插入图片描述

常用响应头信息

  • Content-Type:
    服务器响应回客户端的数据类型在这里插入图片描述

requests模块

Python中原生的一款基于网络请求的模块,功能非常强大,简单便携,效率极高。

作用:
模拟浏览器发请求。

以上就是我们在学习爬虫之前需要了解的内容
接下来我们正式进入爬虫领域

首先思考我们自己上网的步骤:

第一步:打开浏览器
第二步:在浏览器中录入网址
第三步:回车
最后就会得到我们想找的网址

但其实回车后会先对指定网址发送http或https请求,请求成功后才会获得对应的响应数据,即我们想找的页面。

通过我们自己的上网行为即可初见requests的使用方式。

如何使用requests:(requests模块的编码流程)

  1. 指定url (网页地址,即网址)
  2. 发起请求 (http/https请求,输网址按回车后计算机干的事)
  3. 获取响应数据 (页面打开了)
  4. 持久化存储 (把爬取到的数据存储到本地或数据库中)

用requests之前要先进行环境安装:
pip install requests

在PyCharm中 File --> Settings --> Project --> Interpreter -->点击+即可添加

话不多说,上代码!

新手实战演练

# 我的第一个爬虫程序
import requests

url = "https://www.csdn.net/"  # step 1:指定url
response = requests.get(url)  # step 2:发起请求,get方法会返回一个响应对象
page_text = response.text  # step 3:获取响应数据,text返回的是字符串形式的数据
with open('CSDN.html', 'w', encoding='utf-8') as f:  # step 4:持久化存储
    f.write(page_text)
print('爬取数据结束')

下面是爬取结果

在这里插入图片描述
这样我们就得到了CSDN网页的源代码

接下来我们逐个解析上面的代码:

  1. URL 等于的是我们要爬取的网页地址

  2. 我们看到
    在这里插入图片描述
    网页请求方式(Request Method)是GET类型,那么我们在用requests模拟浏览器请求时也要用get请求!!!
    那么,requests.get(url)就是向指定的url发送请求。
    用response接收请求成功后返回的响应对象,即 response = requests.get(url)

  3. response是响应对象,它也有属性 — text 。这个text会返回一组字符串,这组字符串就是我们想要 拿到的响应数据,即网页的html源码数据。
    所以 response.text 就是网页的源码数据 ,把这组数据返回给 page_text 这个变量,就是
    page_text = response.text 的意思

  4. 持久化存储

with open('CSDN.html', 'w', encoding='utf-8') as f:  # step 4:持久化存储
    f.write(page_text)

把爬取到的数据存入.html文件中
在这里插入图片描述这样,一个最简单的爬虫就完成了!

正式入门爬虫

刚才写的那个爬虫呀 不太完整,为什么呢?这就不得不提到我们的UA检测了

反爬策略—UA检测:
门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器,说明该请求是一个正常的请求。但如果检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常的请求(爬虫),那么服务器端会拒绝该次请求。

对于UA检测爬虫就毫无办法了吗?nonono

反反爬策略—UA伪装:
让爬虫对应的请求载体身份标识伪装成某款浏览器。
做法:将对应的 user-agent 封装到字典中
在这里插入图片描述
在开发者工具(F12)中找我们需要的 user-agent

headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (HTML, like Gecko) Chrome/84.0.4147.89 '
                  'Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/30 '
}

通过UA伪装,爬虫才能更好的爬取网页数据。UA伪装必不可少!!!

get 方法的常用参数:

requests.get (url , params , headers)

  1. url参数 是网址
  2. headers参数 是头请求
  3. params参数 设定好后,网页会和 params 通过 get 方法自动拼接
params = {
    '看网页搜索的具体参数': '参数的值'
}

简易网页采集器

先上代码

import requests

url = 'https://so.csdn.net/so/search'  # 处理url携带的参数
head = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 '
                  'Safari/537.36 SLBrowser/7.0.0.12151 SLBChan/30 '
}
select = input('请输入想搜索的关键字:')
param = {
    'q': select,
    't': 'all',

}
response = requests.get(url, params=param, headers=head, verify=False)
page_text = response.text
FileName = select + '.html'
with open(FileName, 'w', encoding='utf-8') as f:
    f.write(page_text)
print('爬取数据完成!!!')

这是我选择的网址

https://so.csdn.net/so/search?spm=1000.2115.3001.4501&q=%E6%A6%82%E7%8E%87%E5%AF%86%E5%BA%A6%E5%87%BD%E6%95%B0&t=&u=

我们首先要知道,?后面那一堆都是参数,参数我们可以通过get方法与url拼接,所以在写url时要把它删掉,所以 url = ‘https://so.csdn.net/so/search’
往下是headers头请求不用多说,每个爬虫程序都要写!
再往下就该处理参数了,我是怎么知道这些参数的呢?还得借助 F12 !
在这里插入图片描述

这些就是我们需要的参数了。咦,有没有感觉很熟悉呢?
没错,它们就是刚刚删除?后的乱码。

https://so.csdn.net/so/search?spm=1000.2115.3001.4501&q=概率密度函数&t=&u=

这下发现了吧!

我们把参数封装在一个字典里,就成了这个样子

param = {
    'q': select,
    't': 'all',

}

但我想要实现动态查询,即输入什么查询什么,所以我不把参数 ‘q’ 写死,而是用了个变量 select 作为 ‘q’ 的值。

接下来按部就班:

  • 发起请求
  • 获得响应数据
  • 持久化存储

就OK了 ,是不是很简单呢

运行结果:

在这里插入图片描述

需要注意的是,有些电脑缺少证书,请求时就要在 response 里加上 verify=False 参数 。

我身边人都不用,就我用在这里插入图片描述

最后,感谢铁甲小宝同学对我的指导,他是我学习的领路人,未来继续跟大佬学习
在这里插入图片描述

  • 21
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值