wordpress回复,北京seo站内优化,做拼货商城网站,一个公司可以做几个网站备案爬虫-1 爬虫学习第一天1、什么是爬虫2、爬虫的工作原理3、爬虫核心4、爬虫的合法性5、爬虫框架6、爬虫的挑战7、难点8、反爬手段8.1、Robots协议8.2、检查 User-Agent8.3、ip限制8.4、SESSION访问限制8.5、验证码8.6、数据动态加载8.7、数据加密-使用加密算法 9、用python学习爬… 爬虫-1 爬虫学习第一天1、什么是爬虫2、爬虫的工作原理3、爬虫核心4、爬虫的合法性5、爬虫框架6、爬虫的挑战7、难点8、反爬手段8.1、Robots协议8.2、检查 User-Agent8.3、ip限制8.4、SESSION访问限制8.5、验证码8.6、数据动态加载8.7、数据加密-使用加密算法 9、用python学习爬虫需要用到 request模块10、函数11、requests模块11.3、玩一下 12、玩一玩豆瓣读书 爬虫学习第一天
1、什么是爬虫 网络爬虫又称为网页蜘蛛网络机器人在FOAF社区中间更经常的称为网页追逐者是一种按照一定的规则自动地抓取万维网信息的程序或者脚本。 通俗来讲假如你需要互联网上的信息如商品价格图片视频资源等但你又不想或者不能自己一个一个自己去打开网页收集这时候你便写了一个程序让程序按照你指定好的规则去互联网上收集信息这便是爬虫我们熟知的百度谷歌等搜索引擎背后其实也是一个巨大的爬虫。
2、爬虫的工作原理
爬虫的基本工作流程通常包括以下几个步骤
发起请求爬虫首先向目标网站发送HTTP请求请求特定的网页内容1。获取响应服务器处理这些请求后会返回相应的网页内容爬虫接收这些内容1。解析内容爬虫对获取的网页内容进行解析提取有用信息。这通常涉及到HTML、CSS和JavaScript的解析。提取数据解析后的内容中爬虫会根据预设的规则提取所需的数据如文本、图片、链接等。存储数据提取的数据会被存储到数据库或文件中以便后续的分析和使用。发现新链接在解析内容的过程中爬虫会发现新的链接地址这些链接将被加入到待爬取的队列中循环执行上述步骤。
3、爬虫核心 **爬取网页:**爬取整个页面包含了网页中所有的内容 **解析数据:**将网页中你得到的数据进行解析获取需要的数据 **存储数据:**将解析后的数据保存到数据库、文件系统或其他存储介质中以便后续的访问和使用。 **分析数据:**对存储的数据进行统计、挖掘和分析提取有价值的信息或洞察为决策提供支持。 **可视化数据:**将分析结果通过图表、图形等形式直观展现出来帮助用户更好地理解和利用数据。
4、爬虫的合法性 爬虫技术本身是中立的其合法性取决于使用爬虫的目的和方式。一般来说只要爬虫的行为不影响网站的正常运行并且不是出于商业目的大多数网站只会采取技术手段限制爬虫如封禁IP或账号而不涉及法律风险1。此外许多网站通过robots.txt文件声明了哪些内容可以被抓取哪些不可以这是一种行业约定虽然没有法律约束力但遵守这些规则是一种良好的网络道德行为1。 5、爬虫框架
随着爬虫技术的发展出现了一些成熟的爬虫框架如Scrapy。这些框架提供了一套完整的解决方案包括请求管理、数据解析、数据存储等使得开发者能够更专注于爬虫逻辑的实现。
6、爬虫的挑战
爬虫在实际应用中可能会遇到一些挑战如网站的反爬策略、动态加载的内容、登录认证等。这些挑战需要爬虫开发者具备一定的技术能力包括但不限于JavaScript逆向、模拟登录、使用代理IP等。
7、难点
爬虫和反爬虫之间的博弈爬虫会加大系统负载并发(每秒访问的人数100)爬虫1000什么是反爬虫 阻止非正常用户来访问我的系统登录站点》输入验证码(图片手机) 刷新太快
8、反爬手段
8.1、Robots协议 8.2、检查 User-Agent 8.3、ip限制 通过对访问频率进行限制如果某个IP地址在单位时间内请求次数过多则可能暂时或永久封禁该IP地址。 8.4、SESSION访问限制 8.5、验证码 8.6、数据动态加载 8.7、数据加密-使用加密算法 9、用python学习爬虫需要用到 request模块 通常先用dir或者help来查看怎么使用 Requests is an HTTP library, written in Python, for human beings.
Requests是一个HTTP库用Python编写供人类使用。这段文本是Python中requests库的一个函数文档字符串描述了get函数的用途和参数。requests是一个非常流行的HTTP库用于发送HTTP请求并处理返回的响应。下面是对这段文档的详细解释### 函数名称
get - 这是requests库中的一个函数用于发送HTTP GET请求。### 参数
- url: 这是必须提供的参数表示要发送GET请求的目标URL。这个URL可以是完整的也可以是相对路径如果是相对路径它会基于当前的URL上下文进行解析。
- params: 这是一个可选参数用于传递查询字符串。它可以是一个字典、列表或元组也可以是字节串。这个参数中的数据会被添加到URL的查询字符串中。例如当你想要传递查询参数如page1和limit10时你可以这样做params{page: 1, limit: 10}。
- **kwargs: 这是Python中的参数字典它允许你传递任意数量的其他参数给函数。在get函数中这可以用来传递requests库中Request对象支持的其他参数比如headers、cookies、auth等。### 返回值
- Response对象 - 当GET请求发送并接收到服务器响应后get函数会返回一个Response对象。这个对象包含了服务器返回的所有信息包括状态码、响应头、以及响应体通常是HTML、JSON或其他格式的数据。### 示例代码
python
import requests# 发送GET请求
response requests.get(https://api.example.com/data, params{page: 1, limit: 10})# 打印响应状态码
print(response.status_code)# 打印响应内容
print(response.text)
在这个示例中我们使用requests.get函数向https://api.example.com/data发送了一个GET请求并且传递了查询参数page1和limit10。然后我们打印出响应的状态码和响应的内容。总的来说requests.get函数是一个非常方便的工具用于发送HTTP GET请求并处理响应。通过这个函数你可以轻松地与Web服务进行交互获取或提交数据。10、函数 get(urlparamsNone,**kwargs)括号中的变量叫函数的参数 url位置参数(有顺序按位置依次给数据) paramsNone 默认参数(如果你没有传递会给一个默认值) *args 可变长位置参数 **kwargs 可变长关键字参数 位置参数的使用: # 定义一个函数实现摄氏度转华氏度
# 32°F 摄氏度 × 1.8def Celsius_To_Fahrenheit(a):b(a*1.8)32print(f{a}°C 转换成 华氏度 为{b:.2f}°F)Celsius_To_Fahrenheit(44.5)更好的写法 # get(url, paramsNone, **kwargs)
# 括号中的变量叫函数的参数
# url 必选位置参数有顺序按位置依次给数据
# 注意按顺序传递参数
# paramsNone 默认参数如果你没有传递会给一个默认值
# *args 可变长位置参数
# **kwargs 可变长关键字参数# 调用requests.get(test, http://www.baidu.com) X 位置参数调用
# requests.get(paramstest, urlhttp://www.baidu.com) J 关键字参数调用# def 函数名(参数列表0-n)
# 函数体
# return value 返回值
def mysum(a, b):return ab
# a 1
# b 2
# 位置参数的调用
print(mysum(1,2))
# 关键字参数的调用
print(mysum(a1, b2))
print(mysum(b2, a1))
# TypeError: mysum() missing 1 required positional argument: b
# mysum(1)# 定义一个函数实现摄氏度转华氏度
# 32°F 摄氏度 × 1.8
# 传递一个摄氏温度 - 返回一个华氏度温度# 参数名:数据类型 告诉调用者该函数需要是什么类型的
# 类型声明是可写可不写的
# - 数据类型 函数的返回值
# return 接返回值 函数如果没有return语句表示返回None
# 文档注释document string和类型注解(type hint)都是可选的def ctof(celsius:int) - float: document string 文档注释 直接用作帮助文档:param celsius: 传递一个int类型的摄氏温度:return: 返回一个float类型的华氏度温度result 32celsius*1.8return result
# pass 占位符 什么也不做 保持语法完整print(ctof(10))# 定义一个函数实现摄氏度转华氏度
# 如果没有传温度过来当作计算 0摄氏度对应的华氏度
# 默认参数
def ctof(celsius:int0) - float: document string 文档注释 直接用作帮助文档:param celsius: 传递一个int类型的摄氏温度:return: 返回一个float类型的华氏度温度result 32celsius*1.8return result
print(ctof())# 默认参数的推荐写法先给它一个默认值为None,在函数体中处理默认
def ctof(celsiusNone) - float: document string 文档注释 直接用作帮助文档:param celsius: 传递一个int类型的摄氏温度:return: 返回一个float类型的华氏度温度if celsius is None:celsius 0result 32celsius*1.8return resultimport requests
# print(dir(requests))
help(requests.get)# get(url, paramsNone, **kwargs)
# 括号中的变量叫函数的参数
# url 必选位置参数有顺序按位置依次给数据
# 注意按顺序传递参数
# paramsNone 默认参数如果你没有传递会给一个默认值
# *args 可变长位置参数
# **kwargs 可变长关键字参数# 调用requests.get(test, http://www.baidu.com) X 位置参数调用
# requests.get(paramstest, urlhttp://www.baidu.com) J 关键字参数调用# def 函数名(参数列表0-n)
# 函数体
# return value 返回值
def mysum(a, b):return ab
# a 1
# b 2
# 位置参数的调用
print(mysum(1,2))
# 关键字参数的调用
print(mysum(a1, b2))
print(mysum(b2, a1))
# TypeError: mysum() missing 1 required positional argument: b
# mysum(1)# 定义一个函数实现摄氏度转华氏度
# 32°F 摄氏度 × 1.8
# 传递一个摄氏温度 - 返回一个华氏度温度# 参数名:数据类型 告诉调用者该函数需要是什么类型的
# 类型声明是可写可不写的
# - 数据类型 函数的返回值
# return 接返回值 函数如果没有return语句表示返回None
# 文档注释document string和类型注解(type hint)都是可选的def ctof(celsius:int) - float: document string 文档注释 直接用作帮助文档:param celsius: 传递一个int类型的摄氏温度:return: 返回一个float类型的华氏度温度result 32celsius*1.8return result
# pass 占位符 什么也不做 保持语法完整print(ctof(10))# 定义一个函数实现摄氏度转华氏度
# 如果没有传温度过来当作计算 0摄氏度对应的华氏度
# 默认参数
def ctof(celsius:int0) - float: document string 文档注释 直接用作帮助文档:param celsius: 传递一个int类型的摄氏温度:return: 返回一个float类型的华氏度温度result 32celsius*1.8return result
print(ctof())# 默认参数的推荐写法先给它一个默认值为None,在函数体中处理默认
def ctof(celsiusNone) - float: document string 文档注释 直接用作帮助文档:param celsius: 传递一个int类型的摄氏温度:return: 返回一个float类型的华氏度温度if celsius is None:celsius 0result 32celsius*1.8return result# *args 可变长位置参数 接受多个位置参数
# **kwargs 可变长关键字参数 接受多个关键字参数# 实现一个mysum函数可以接收多个数据计算这个数据的和
# args arguments
# kw keyword
def mysum2(*args, **kwargs) -int :计算出所有传进来的数据之和:param args::param kwargs::return:print(args:, args, type(args))print(kwargs:, kwargs, type(kwargs))mysum2(1,2,3,4, a1, b2, c3)
# 注意 : SyntaxError: positional argument follows keyword argument
# 位置参数必须写在关键字参数的前面
mysum2(1, 2, a1, b2)#!/usr/bin/env python
# FileName :1.python函数.py
# Time :2024/3/10 14:59
# Author :wenyao# 4月底 爬虫数据分析数据可视化
# requests dir哪些功能, help函数具体怎么用
# requests.get函数# get(url, paramsNone, **kwargs)# 注意参数类型的顺序
def 函数名(位置参数默认参数可变长位置参数可变长关键字参数) - 返回值类型:passreturn 返回值
def function(a:int, b:int0, *args, **kwargs) - int:return a
如果函数没有返回值相当于return None
def sum(*args, **kwargs)-int:# args 保存调用时传的所有的位置参数# kwargs 保存调用时传的所有的关键字参数如:a1print(args) # tupleprint(kwargs) # dicts 0for i in args:sifor key in kwargs:skwargs[key]return s# 什么情况下需要return 如果算出来的结果还有其他用途print(sum(1,2,3,a4,b5,c6))
1. 函数定义参数的类型4类注意顺序
2. 函数调用参数类型2类注意顺序
3. 注释文档注释写的一些帮助信息-help时可以看到,类型注解给参数和返回值做类型声明 类型注解在高版本中是否有强制类型限制
4. 返回值: return 如果结果还需要用一般情况建议返回
import requests
help(requests.get)11、requests模块
11.3、玩一下
#获取百度首页信息
import requestsurl https://www.baidu.com
response requests.get(url)
print(response,type(response))# requests模块功能
# 相当于一个模块浏览器发送网络请求获取数据import requests
# 获取百度首页的数据
urlhttp://www.baidu.com
response requests.get(url)
print(response, type(response))
# status_code 200 OK
# 用代码的方式告诉你你的请求是否正确
# 2XX 成功
# 4XX 客户端错误
# 5XX 服务端错误
# $? 0 成功其他错误
# 取出当前响应的状态码
print(response.status_code)
# 获取当前的网页数据
# text string
print(response.text[:100])
# content bytes
print(response.content[:100])
# 获取请求的url
print(response.url)
# 获取响应头信息
print(response.headers)
print(dir(response))
# 获取编码方式 UTF8(全球),GBK(中文)
print(response.encoding)
# 推荐
print(response.apparent_encoding)12、玩一玩豆瓣读书
import requestsdef download(url:str) - str:这个函数用来获取url的数据返回网页的string:param url: 这应该提供一个网址:return: 返回网页的string类型的数据response requests.get(url)if response.status_code 200:return response.textelse:return Noneprint(download(http://www.baidu.com))
def download(url: str) - str | None:这个函数用来获取url的数据返回网页的string:param url: 这应该提供一个网址:return: 返回网页的string类型的数据headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3}response requests.get(url, headersheaders)if response.status_code 200:return response.textelse:return Noneprint(download(https://book.douban.com/))大佬写的
import requests
import time# def download(url:str) - str:
#
# 这个函数数用来获取url的数据返回网页的string
# :param url: 应该提供一个网址
# :return: 返回网页的string类型的数据
#
# response requests.get(url)
# if response.status_code 200:
# # 指定正确的网页编码
# response.encoding response.apparent_encoding
# return response.text
# else:
# return # try...except
def download(url:str) - str:这个函数数用来获取url的数据返回网页的string:param url: 应该提供一个网址:return: 返回网页的string类型的数据# 反爬虫1添加user-agentheaders {user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36}response requests.get(url, headersheaders)# 如果没有获取到网页或者获取到网页了但状态码不对那么请报异常# 4xx , 5xx 都会抛出异常response.raise_for_status()# 指定正确的网页编码response.encoding response.apparent_encoding# 反爬虫2增加sleeptime.sleep(1)return response.text# print(download(http://www.baidu3sdf.com))
# print(download(https://gitee.com/asdfasdf))# 1. 获取数据
data download(https://book.douban.com/top250)
# 2. 提取数据
# re模块正则表达式速度最快使用难度最高
# lxml(xpath): 速度较快使用难度一般
# BeautifulSoup: 慢最简单PS E:\downloads\san_chuang\pycharm\allProjects\pa_chong pip install beautifulsoup4
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting beautifulsoup4Downloading https://pypi.tuna.tsinghua.edu.cn/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl (147 kB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 147.9/147.9 kB 1.1 MB/s eta 0:00:00
Collecting soupsieve1.2 (from beautifulsoup4)Downloading https://pypi.tuna.tsinghua.edu.cn/packages/4c/f3/038b302fdfbe3be7da016777069f26ceefe11a681055ea1f7817546508e3/soupsieve-2.5-py3-none-any.whl (36 kB)
Installing collected packages: soupsieve, beautifulsoup4
Successfully installed beautifulsoup4-4.12.3 soupsieve-2.5
PS E:\downloads\san_chuang\pycharm\allProjects\pa_chong