python爬虫笔记1

news2024/11/15 6:43:07

1 爬虫介绍

爬虫概述: 获取网页并提取和保存信息的自动化程序 1.获取网页 2.提取信息 css选择器 xpath 3.保存数据(大数据时代) 4.自动化 爬虫(资产收集,信息收集)+ 漏扫(帮我发现漏洞)= 钱src hw 逆向工程(必须)

2 urllib模块介绍

urllib 是 Python 标准库中的一个模块,用于执行 HTTP 请求操作。它包含了四个主要的子模块,每个子模块都有其特定的功能:

  • urllib.request 模块:这是最基本的 HTTP 请求模块,它提供了打开和读取 URL 的功能。使用此模块,你可以发起 GET 和 POST 请求,处理 cookies 和重定向,以及设置请求头部等。

  • urllib.error 模块:这个模块用于处理与 urllib.request 相关的异常。当你使用 urllib.request 发起请求时,如果遇到错误(如网络问题、无效的 URL 或服务器错误),该模块会抛出相应的异常,以便你能够捕获并处理这些错误。

  • urllib.parse 模块:这是一个工具模块,提供了处理 URL 的方法。你可以使用它来解析 URL,将其分解为各个组件(如协议、主机名、路径等),也可以构建新的 URL。此外,它还提供了编码和解码 URL 参数的功能。

  • urllib.robotparser 模块:这个模块用于解析 robots.txt 文件。robots.txt 文件是网站用来告诉爬虫哪些页面可以爬取,哪些页面不能爬取的。urllib.robotparser 模块提供了一个 RobotFileParser 类,用于读取和解析 robots.txt 文件,并判断一个特定的爬虫(通过其用户代理字符串)是否有权限访问某个 URL。

总结来说,urllib 是 Python 中用于执行 HTTP 请求和处理相关操作的内置库,它包含了请求、异常处理、URL 解析和机器人协议解析等功能的模块,使得开发者能够方便地进行网络请求和数据抓取。

3 第一个爬虫

新建urllib_1.py

#!/usr/bin/env python
​
import urllib.request
​
#发送一个最基本的请求
def load_baidu_data():
    url='http://www.baidu.com'
    response = urllib.request.urlopen(url)
    #print(response.code)
    data = response.read()
    #将data获取到的东西转换为字符串
    str_data = data.decode('utf-8')
    print(str_data)
    #将数据写入文件
    with open("baidu.html","w",encoding="utf-8") as f:
        f.write(str_data)
        
    
​
load_baidu_data()

效果

4 get请求拼接

新建urllib_2.py

#!/usr/bin/env python
​
import urllib.request
import urllib.parse
import string
​
def load_baidu_data():
    url = 'http://www.baidu.com/s?wd='
    #url+search
    name = "李四"
​
    final_url= url+name
    #网址里面包含了汉字 需要进行转码
    encode_url = urllib.parse.quote(final_url,safe=string.printable)
    print(encode_url)
    response = urllib.request.urlopen(encode_url)
    # print(response.code)
    data = response.read()
    #将data获取到的东西转换为字符串
    str_data = data.decode('utf-8')
    print(str_data)
    #将数据写入文件
    with open("baidu-lisi.html","w",encoding="utf-8") as f:
        f.write(str_data)
    
    
    
load_baidu_data()   

效果

5 get请求拼接多个参数

新建urllib_3.py

#!/usr/bin/env python
​
import urllib.request
import urllib.parse
import string
​
def load_baidu_data():
    url = 'http://www.baidu.com/s?'
    params = {
        "wd":"猪八戒",
        "pn":"80"
    }
    query_str = urllib.parse.urlencode(params)
    final_url= url+query_str
    print(final_url)
    # encode_url = urllib.parse.quote(query_str,safe=string.printable)
    response = urllib.request.urlopen(final_url)
    # print(response.code)
    data = response.read()
    #将data获取到的东西转换为字符串
    str_data = data.decode('utf-8')
    print(str_data)
    #将数据写入文件
    with open("baidu-zhubajie-pn20.html","w",encoding="utf-8") as f:
        f.write(str_data)
​
load_baidu_data()

效果

6 post请求

新建urllib_post.py

#!/usr/bin/env python
​
import urllib.request
import urllib.parse
import urllib.error
​
#1.定义url
url = 'http://httpbin.org/post'
​
#创建要发送的数据表单
data = {
    'hello':'world',
    'handsome':'zhubajie'
}
​
#data要进行编码
data_encode = urllib.parse.urlencode(data).encode("utf-8")
​
#加上encode(“utf-8”)->  stt-》bytes
#解码 decode("utf-8")     byte-》str
​
response = urllib.request.urlopen(url=url,data=data_encode)
​
print(response.read().decode("utf-8"))

效果

7 超时设置

#!/usr/bin/env python
​
import urllib.request
import urllib.parse
import urllib.error
​
#1.定义url
url = 'http://httpbin.org/post'
​
#创建要发送的数据表单
data = {
    'hello':'world',
    'handsome':'zhubajie'
}
​
#data要进行编码
data_encode = urllib.parse.urlencode(data).encode("utf-8")
​
#加上encode(“utf-8”)->  stt-》bytes
#解码 decode("utf-8")     byte-》str
​
try:
    response = urllib.request.urlopen(url=url,data=data_encode,timeout=0.1)
    print(response.read().decode("utf-8"))
except urllib.error.URLError as e:
    print("连接超时!")

效果

8 自定义user-agent

自定义User-Agent是一种灵活调整浏览器或其他客户端在发送HTTP请求时所携带的身份标识的技术。通过修改User-Agent字符串,用户可以伪装成不同的客户端类型或操作系统,以满足特定需求,如进行兼容性测试、爬虫伪装或数据分析等。但需要注意的是,自定义User-Agent应遵守相关规定,避免滥用导致违反使用协议或法律。总之,自定义User-Agent为用户提供了更多控制和灵活性。

新建request_head.py

#!/usr/bin/env python
​
import urllib.request
import urllib.parse
import urllib.error
​
#1.定义url
url = 'http://httpbin.org/post'
​
#2自定义request  添加一个user-agent
header = {
    "User-Agent":"Mozilla/5.0 (Linux; U; Android 11; zh-CN; 2112123AC Build/RKQ1.200826.002) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/100.0.4896.58 Quark/6.2.2.246 Mobile Safari/537.36"
}
​
req = urllib.request.Request(url=url,headers=header,method='POST')
response = urllib.request.urlopen(req)
print(response.read().decode("utf-8"))

效果

9 小项目-随机user-agent

新建randm_useragent.py

#!/usr/bin/env python
​
import urllib.request
import urllib.parse
import urllib.error
import random
​
def user_agent():
    url = 'http://httpbin.org/post'
    #搞一堆user-agent
    user_agent_list = [
        "Mozilla/5.0 (Linux; Android 12; ELS-AN00 Build/HUAWEIELS-AN00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/107.0.5304.141 Mobile Safari/537.36 XWEB/5075 MMWEBSDK/20230504 MMWEBID/9308 MicroMessenger/8.0.37.2380(0x2800253D) WeChat/arm64 Weixin NetType/5G Language/zh_CN ABI/arm64 MiniProgramEnv/android",
        "Mozilla/5.0 (iPhone; CPU iPhone OS............ile/15E148 MicroMessenger/8.0.34(0x18002234) NetType/4G Language/zh_CN",
        "Mozilla/5.0 (Windows; U; Windows NT 5.1; hu; rv:1.8.0.11) Gecko/20070312 Firefox/1.5.0.1120",
        "Mozilla/5.0 (Macintosh; Int............ecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67",
        "Mozilla/5.0 (X1............7.6) Gecko/20050318 Firefox/1.0.2",
        "Mozilla/5.0 (Windows; U; Win............o) Chrome/100.0.4896.58 Safari/537.36 UCBrowser/15.4.8.1238"
    ]
    #每次取一个user-agent
    random_user_agent = random.choice(user_agent_list)
    header = {
        "User-Agent":random_user_agent
    }
​
    req = urllib.request.Request(url=url,headers=header,method='POST')
    response = urllib.request.urlopen(req)
    print(response.read().decode("utf-8"))
​
user_agent()    

效果

10自定义构建opener

新建handler_open.py

#!/usr/bin/env python
​
import urllib.request
import urllib.parse
import urllib.error
​
def handler_open():
    url = 'http://httpbin.org/get'
    #创建自己的opener
    handler = urllib.request.HTTPHandler()
    opener = urllib.request.build_opener(handler)
    response = opener.open(url)
    print(response.read().decode("utf-8"))
    
handler_open()    

效果

11 配置代理

免费代理

新建proxy_handler.py

#!/usr/bin/env python
​
import urllib.request
import urllib.parse
import urllib.error
​
def handler_open():
    try:
        url = 'http://httpbin.org/get'
    #添加代理 代理的ip 端口
        proxy = {
            "http":"http://115.207.183.169:18784"
        }
        #创建代理处理器
        proxy_handler = urllib.request.ProxyHandler(proxy)
        #创建自己的opener
        opener = urllib.request.build_opener(proxy_handler)
        response = opener.open(url)
        print(response.read().decode("utf-8"))
    except urllib.error.URLError as e:
        print("error: ",e)    
    
handler_open()    
    

效果

12 小项目-随机ip代理

新建random_ip.py

#!/usr/bin/env python
​
import urllib.request
import urllib.parse
import urllib.error
import random
​
def proxy_ip():
    url = 'https://www.kuaidaili.com/testproxy'
    #搞一堆ip
    ip_list = [
        "http://183.161.45.66:17114",
        "http://119.41.198.172:18350",
        "http://27.191.60.244:15982",
        "http://27.215.237.221:20983",
    ]
    #每次取一个ip
    proxy = random.choice(ip_list)
    # header = {
    #     "User-Agent":random_user_agent
    # }
    print(proxy)
    try:
    #     url = 'http://httpbin.org/get'
    # #添加代理 代理的ip 端口
    #     proxy = {
    #         "http":"http://115.207.183.169:18784"
    #     }
        #创建代理处理器
        proxy_handler = urllib.request.ProxyHandler({'http':proxy,'https':proxy})
        #创建自己的opener
        opener = urllib.request.build_opener(proxy_handler)
        response = opener.open(url)
        print(response.read().decode("utf-8"))
    except urllib.error.URLError as e:
        print("error: ",e)    
​
proxy_ip()  

13 授权认证

新建authpassword.py

#!/usr/bin/env python
​
import urllib.request
​
from urllib.parse import urlparse
​
def auth_login():
    url = 'https://ssr3.scrape.center/'
    #指定用户名and密码
    username = 'admin'
    password = 'admin'
    #创建一个密码管理器
    password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
    #添加进目标url,用户名 密码
    password_mgr.add_password(None,url,username,password)
    #创建一个基本密码认证处理器并将密码管理器传递给他
    handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
    #创建网络请求的构造器
    opener = urllib.request.build_opener(handler)
    response = opener.open(url)
    # response = urllib.request.urlopen(url)
    print(response.read().decode('utf-8'))
    
auth_login()    
    

效果

14 cookie认证流程

新建Cookie1.py

#!/usr/bin/env python
​
import urllib.request
​
from urllib.parse import urlparse
​
def auth_login():
    url = 'https://ssr3.scrape.center/'
    headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.54',
        'Authorization':'Basic YWRtaW46YWRtaW4='
    }
    req = urllib.request.Request(url=url,headers=headers)
    response = urllib.request.urlopen(req)
    print(response.read().decode('utf-8'))
    
auth_login()   

效果

15 使用cookiejar读写cookie

新建Cookie2.py

#!/usr/bin/env python
​
import urllib.request
import http.cookiejar
​
​
filename = 'cookies.txt'
#定义保存cookie的文件
filename = 'cookies.txt'
cookie = http.cookiejar.LWPCookieJar(filename=filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('https://www.baidu.com')
​
cookie.save(ignore_discard=True,ignore_expires=True)
​
​
#读:
cookie = http.cookiejar.LWPCookieJar()
cookie.load(filename,ignore_discard=True,ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))

效果

16 小项目-使用cookie登录网页

新建Cookie3.py

#!/usr/bin/env python
​
import urllib.request
import http.cookiejar
import urllib.parse
​
#1.用账号密码登录网站
​
# #登录的url
url = 'https://www.yaozh.com/login'
#登录的参数
login_data = {
    "type":"0",
    "username":"ppkke007",
    "pwd":"Iceropq13315",
    "pc_vcode":"",
    "country":"86_zh-CN",
    "mobile":"",
    "vcode":"",
    "pincode":"",
    "formhash":"CEA7846B38",
    "backurl":"https%253A%252F%252Fwww.yaozh.com%252F"
}
#发送登录请求
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.54',
}
# #转码
login_str = urllib.parse.urlencode(login_data).encode('utf-8')
​
req = urllib.request.Request(url=url,headers=headers,data=login_str)
#如果登录成功 cookjar会自动保存cookie
opener.open(req)
​
#2.代码带着cookie去访问
login_url = "https://www.yaozh.com/member/"
req2 = urllib.request.Request(login_url,headers=headers)
# response = opener.open(login_url)
response = urllib.request.urlopen(login_url)
# print(response.read().decode('utf-8'))
data = response.read()
with open('cookie2.html',"wb") as f:
    f.write(data) 

效果

17 异常处理

新建urlerror.py

#!/usr/bin/env python
​
import urllib.request
from urllib.error import *
import socket
​
try:
    url = 'https://www.baidu.com'
    response = urllib.request.urlopen(url=url,timeout=0.01)
except URLError as e:
     print(e.reason)
     if isinstance(e.reason,socket.timeout):
         print("Time out!!")
​
# except URLError as e:
#     print(e.reason)    

效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】《ChatGPT速通手册》笔记

文章目录 第0章 前言第1章 ChatGPT的由来(一)自然语言处理任务(二)ChatGPT所用数据数据大小(三)ChatGPT的神经网络模型有175亿个参数(四)模型压缩 方案 第2章 ChatGPT页面功能介绍&a…

每日算法4/21

LCR 073. 爱吃香蕉的狒狒 题目 狒狒喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。 狒狒可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选…

Json三方库介绍

目录 Json是干什么的Json序列化代码Json反序列化代码 Json是干什么的 Json是一种轻量级的数据交换格式,也叫做数据序列化方式。Json完全独立于编程语言的文本格式来存储和表述数据。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升…

MATLAB求和函数

语法 S sum(A) S sum(A,“all”) S sum(A,dim) S sum(A,vecdim) S sum(,outtype) S sum(,nanflag) 说明 示例 S sum(A) 返回沿大小大于 1 的第一个数组维度计算的元素之和。 如果 A 是向量,则 sum(A) 返回元素之和。 如果 A 是矩阵,则 sum(A) 将…

2023年网络安全行业:机遇与挑战并存

2023年全球网络安全人才概况 根据ISC2的《2023年全球网络安全人才调查报告》,全球的网络安全专业人才数量达到了550万,同比增长了8.7%。然而,这一年也见证了网络安全人才短缺达到了历史新高,缺口数量接近400万。尤其是亚太地区&am…

【题解】NC40链表相加(二)(链表 + 高精度加法)

https://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b?tpId196&tqId37147&ru/exam/oj class Solution {public:// 逆序链表ListNode* reverse(ListNode* head) {// 创建一个新节点作为逆序后链表的头节点ListNode* newHead new ListNode(0);// 当前…

Spring Boot中接收各种各样的参数

一、接收json参数&#xff0c;封装为Map 1.1、核心代码 /*** 接收json参数&#xff0c;封装为Map* param servletRequest* return* throws Exception*/ PostMapping("/getParam") public R getParam(HttpServletRequest servletRequest) throws Exception {Map<…

MyCat 分片

一、垂直拆分 1、场景概述&#xff1a; 在业务系统中&#xff0c;由于用户与订单每天都会产生大量的数据&#xff0c;单台服务器的数据存储及处理能力是有限的&#xff0c;可以对数据库表进行进行垂直分库操作。将商品相关的表拆分到一个数据库服务器&#xff0c;订单表拆分到…

Spring(下)

接上篇&#xff0c;从第八个问题讲起 八.Spring工厂创建复杂对象 1.什么是复杂对象 简单对象就是可以直接new出来的&#xff0c;也就是直接调用构造方法创建 所以复杂对象就是不能直接通过调用构造方法创建。就比如JDBC中的Connection 2.三种方法 &#xff08;1&#xff…

【LeetCode刷题记录】206. 反转链表

206 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1] 示例…

毕业设计——基于ESP32的智能家居系统(语音识别、APP控制)

ESP32嵌入式单片机实战项目 一、功能演示二、项目介绍1、功能演示2、外设介绍 三、资料获取 一、功能演示 多种控制方式 ① 语音控制 ②APP控制 ③本地按键控制 ESP32嵌入式单片机实战项目演示 二、项目介绍 1、功能演示 这一个基于esp32c3的智能家居控制系统&#xff0c;能实…

MyCat 数据库中间件

一、介绍 1、单数据库进行数据存储的问题&#xff1a; IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足以容纳这些热点数据&#xff0c;产生大量磁盘IO&#xff0c;效率较低。 CPU瓶颈&#xff1a;排序、分组、连接查询、聚合统计等SQL会耗费大量的CPU资源。 2、…

Rest接口/Nginx日志记录和采集

文章目录 一、Rest接口日志二、Nginx日志三、采集日志四、夜莺查看Nginx日志五、夜莺查看Rest接口日志 一、Rest接口日志 记录日志字典定义 接口URL接口名称,类别,入参全记录,出参全记录,入参字段1:中文名1/入参字段2:中文名2,出参字段1:中文名1/test/api/login账户登录,登录…

【C++】开始使用优先队列

送给大家一句话: 这世上本来就没有童话&#xff0c;微小的获得都需要付出莫大的努力。 – 简蔓 《巧克力色微凉青春》 开始使用优先队列 1 前言2 优先队列2.1 什么是优先队列2.2 使用手册2.3 仿函数 3 优先队列的实现3.1 基本框架3.2 插入操作3.3 删除操作3.4 其他函数 4 总结T…

kubernetes的网络通信实现原理

网络原理 Kubernetes网络原理详解&#xff1a;一、Kubernetes 网络实现1.容器到容器&#xff08;同一Pod内&#xff09;通信流程&#xff1a;2. pod之间的通信&#xff08;以Calico为例&#xff09;&#xff1a; 二、CNI 网络模型三、网络策略四、开源的容器网络方案五、 常见网…

Linux管道共享内存

前言 进程虽然是独立运行的个体&#xff0c;但它们之间有时候需要协作才能完成一项工作&#xff0c;比如有两个进程需要同步数据&#xff0c;进程 A 把数据准备好后&#xff0c;想把数据发往进程 B&#xff0c;进程 B 必须被提前通知有数据即将到来&#xff0c;或者进程 A 想发…

Spark集群的搭建

1.1搭建Spark集群 Spark集群环境可分为单机版环境、单机伪分布式环境和完全分布式环境。本节任务是学习如何搭建不同模式的Spark集群&#xff0c;并查看Spark的服务监控。读者可从官网下载Spark安装包&#xff0c;本文使用的是spark-2.0.0-bin-hadoop2.7.gz。 1.1.1搭建单机版…

《乱弹篇(30)厌战的杜诗》

时下地球村有一伙成天叫嚣着“打打杀杀”、鼓吹快快发动战争的狂人&#xff0c;他们视老百姓的生命如草芥&#xff0c;毫不珍惜。没有遭受过战火焚烧的人&#xff0c;也跟着成天吠叫“快开战吧”。然而中国唐朝大诗人却是个“厌战派”&#xff0c;他对战争的厌恶集中表现在诗《…

实在RPA设计器试用导引

一、产品概述 实在RPA设计器是一款将人工智能(AI)与机器人流程自动化(RPA)深度融合的可视化自动流程编辑器。它通过AI推荐与桌面嵌入式交互&#xff0c;极大简化了RPA的使用难度&#xff0c;让普通业务人员也能轻松使用。实在RPA设计器具备以下核心优势&#xff1a; 兼容性&a…

我与C++的爱恋:类和对象(四)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 朋友们大家好&#xff01;本篇是类和对象的最后一个部分。 一、static成员 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之…