Python爬虫入门

一,爬虫概述

网络爬虫,顾名思义,它是一种顺着url爬取网页数据的自动化程序或者脚本。可以认为地,我们给予爬虫一个网站的url,它就会返回给我们网站的源代码,我们通过正则表达式来筛选我们需要的内容数据,这就是爬虫的目的,而所谓的反爬和反反爬策略只是这个过程的障碍与应对。

反爬机制:门户网站对爬虫的应对策略,防止爬虫对网站的数据进行爬取。

反反爬策略:对反爬机制的应对策略

Robots.txt:该文件规定了网站哪些数据是否允许爬取。

python 复制代码
from urllib.request import urlopen

url="http://www.baidu.com"

response = urlopen(url)

print(response.read().decode("utf-8"))#拿到的是页面源代码

上述代码就是最简单的爬虫,获取到url后返回给我们网页的源代码(页面源代码html,css,js,在浏览器中,浏览器会对代码进行渲染。)

二,Web请求过程

客户端向服务端发送请求,服务端接收到请求后进行判断,允许后进行html拼接,然后返回给客户端,客户端浏览器对html文件进行渲染形成我们所看见的页面。

实际情况中,网站通常会采用分布式,即将html文件和数据分开来返回给客户端,这样可以把服务器的压力分摊,当访问人数过多时不至于服务器宕机。

三,HTTP协议

HTTP协议(Hyper Text Transfer Protocol超文本传输协议),是用于从万维网传输超文本到本地浏览器的传送协议。

请求:

1.请求行 -> 请求方式(get/post) 请求url地址 协议

2.请求头 -> 放一些服务器要用的附加信息

4.请求体 -> 放一些请求参数

响应:

1.状态行 -> 协议 状态码

2.响应头 -> 放一些客户端要使用的一些附加信息

4.响应体 -> 服务器返回的真正客户端要用的内容

四,Requests模块

安装requests模块:

pip install requests

python 复制代码
Import requests

#爬取百度源代码
url="http://www.baidu.com"

res=requests.get(url)#[Response200]200是状态码,没问题
print(res.content.decode('utf-8'))#拿到源代码



Import requests

content=input("输入你要检索的内容")

url=f"https://www.sogou.com/web?query={content}"

response=requests.get(url)

print(response.text)

我们发现,我们发送的请求被验证拦截下来了,这是因为我们发送请求的请求头不是设备的型号,而是python的型号,这被服务端识别并拦截。

python 复制代码
importrequests

content=input("输入你要检索的内容")
headers=
{"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/124.0.0.0Safari/537.36Edg/124.0.0.0"}

url=f"https://www.sogou.com/web?query={content}"

response=requests.get(url,headers=headers)

print(response.text)

我们模拟了设备的请求头,再次发送,成功骗过服务端,获取到数据。

五,Post请求

我们打开百度翻译,调成英文输入法,打开network观察XHR(ajax请求)

看得出来,表单数据放在了XHR文件中而没有拼接在url上,所以说post是一种隐式提交,get是显式提交

python 复制代码
import requests
import json
headers={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/124.0.0.0Safari/537.36Edg/124.0.0.0"}

url="https://fanyi.baidu.com/sug"

data={
"kw":input("请输入一个单词")
}
response=requests.post(url,data=data)
response=json.loads(response.text)
print(response)

输出结果:

{'errno': 0, 'data': [{'k': 'happy', 'v': 'adj. 快乐的; 幸福的; 巧妙的; 〈口〉有点醉意的'}, {'k': 'Happy', 'v': '[人名] 哈皮; [地名] [美国] 哈皮'}, {'k': 'Happy Day', 'v': '新春如意(歌名)'}, {'k': 'happy lot', 'v': '福分;福气'}, {'k': 'happy home', 'v': '快乐家庭'}], 'logid': 2211867141}

相关推荐
lili-felicity5 分钟前
CANN性能调优与实战问题排查:从基础优化到排障工具落地
开发语言·人工智能
独自破碎E7 分钟前
【BISHI15】小红的夹吃棋
android·java·开发语言
进阶小白猿20 分钟前
Java技术八股学习Day33
java·开发语言·学习
历程里程碑1 小时前
普通数组----合并区间
java·数据结构·python·算法·leetcode·职场和发展·tornado
weixin_395448911 小时前
mult_yolov5_post_copy.c_cursor_0205
c语言·python·yolo
执风挽^1 小时前
Python基础编程题2
开发语言·python·算法·visual studio code
Z9fish1 小时前
sse哈工大C语言编程练习20
c语言·开发语言·算法
csdn_aspnet1 小时前
Libvio.link爬虫技术深度解析:反爬机制破解与高效数据抓取
爬虫·反爬·libvio
纤纡.2 小时前
PyTorch 入门精讲:从框架选择到 MNIST 手写数字识别实战
人工智能·pytorch·python
kjkdd2 小时前
6.1 核心组件(Agent)
python·ai·语言模型·langchain·ai编程