Python urllib 爬虫入门(2)

news2025/2/24 6:37:12

本文为Python urllib类库爬虫更入门的一些操作和爬虫实例及源码。

目录

模拟浏览器请求

简单模拟

设置随机user-agent

请求超时

HTTP请求类型

Get请求

Post请求

抓取网页动态请求

封装ajax请求

调用

循环调用

抓取小说

封装请求函数

把html写入本地分析

调用

正则匹配

网页内容

正则匹配设置

总结


模拟浏览器请求

简单模拟

通过f12查看相应请求的请求头信息,进行简单的模拟请求。

示例如下:

import urllib.request

url = 'http://www.baidu.com'
# 模拟请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
}

# 设置请求实体
req = urllib.request.Request(url, headers=headers)

# 发起请求
response = urllib.request.urlopen(req)
data = response.read().decode('utf-8')
print(data)

设置随机user-agent

示例如下:

import random
import urllib.request

url = 'http://www.baidu.com'
# 随机请求头
agentsList = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
]
agentStr = random.choice(agentsList)
req = urllib.request.Request(url)
# 向请求体中添加随机User-Agent
req.add_header("User-Agent", agentStr)
response = urllib.request.urlopen(req)
data = response.read().decode('utf-8')
print(data)

请求超时

如果网页长时间未响应,设置超时时间,不在爬取。

通过timeout参数来设置,单位为秒。

示例如下:

import urllib.request

for i in range(1, 10):
    try:
        req = urllib.request.urlopen('http://www.baidu.com', timeout=1)
        print(req.read().decode('utf-8'))
    except:
        print('已经超时,继续爬取下一个!')

HTTP请求类型

使用场景:进行客户端与服务端之间的消息传递时使用

GET:通过URL网址传递信息,可以直接在URL网址上添加要传递的信息

POST:可以向服务器提交数据,是一种比较流行的比较安全的数据传递方式

PUT:请求服务器存储一个资源,通常要指定存储的位置

DELETE:请求服务器删除一个资源BAD:请求获取对应的HTTP报头信息

OPTIONS:可以获取当前UTL所支持的请求类型

Get请求

特点:参数可直接在url中传输

优点:速度快,操作简单,主要用于接收数据。

缺点:不安全,并且传输的数据有限。

示例如下:

import urllib.request

url = 'http://www.baidu.com'
req = urllib.request.urlopen(url)
data = req.read().decode('utf-8')
print(data)
print(type(data))

 

Post请求

特点:把参数进行打包,单独传输

优点:可承载数据量大,并且安全(当对服务器数据进行修改时建议使用post)

缺点:速度慢

示例如下:

import urllib.request

url = 'http://localhost/2404/2.php'
# 将要发送的数据合成一个字典
data = {'username': '张三', 'pwd': '123456'}
# 对要发送的数据进行打包
postData = urllib.parse.urlencode(data).encode('utf-8')
# 请求体
req = urllib.request.Request(url, postData)
# 请求
req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0")
response = urllib.request.urlopen(req)
print(response.read().decode('utf-8'))

抓取网页动态请求

封装ajax请求

把抓取网页动态ajax请求处理封装为函数。

示例如下:

import json
import urllib.request
import ssl


def ajaxRequest(page, pageSize):

    url = 'https://pre-api.tuishujun.com/api/listBookRank?rank_type=finish&first_type_id=1&second_type_id=7&page=' + str(page) + '&pageSize=' + str(pageSize)
    # 设置请求头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
        "Accept": "application/json, text/plain, */*",
        "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
        "Cookie": "HWWAFSESTIME=1714019095289; HWWAFSESID=b1ddc79c3c2d6f806c"
    }
    req = urllib.request.Request(url, headers=headers)
    # 使用ssl创建未验证的上下文
    context = ssl._create_unverified_context()
    response = urllib.request.urlopen(req, context=context)

    jstr = response.read().decode('utf-8')
    data = json.loads(jstr)
    # print(data)
    # print(type(data))
    return data

调用

print(ajaxRequest(1, 10))

执行结果:

 

循环调用

加入到循环中,模拟请求10次。

示例如下:

# 循环调用
data = {}
for i in range(1, 10):
    data[i] = ajaxRequest(i, 10)

print(data)

 

抓取小说

在爬虫获取网页内容后使用正则匹配获取相应内容。

本实例将请求一个小说网站首页的最热小说。

封装请求函数

示例如下:

import urllib.request

def bookReptiles(url):
    # 设置请求头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
        "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
    }
    req = urllib.request.Request(url, headers=headers)
    response = urllib.request.urlopen(req)
    data = response.read().decode('utf-8')
    return data

把html写入本地分析

可在封装函数中最后返回前调用,写入本地文件中分析网页内容用于设置正则匹配规则。

示例如下:

def writeLocal(content):
    # 写入本地 分析结构
    path = './xiaoshuo.html'
    with open(path, 'w', encoding='utf-8') as f:
        f.write(content)

调用

设置好请求地址,并把请求地址传递给封装的函数即可。

示例如下:

url = '小说网站路径'
data = bookReptiles(url)

正则匹配

通过查看通过上文写入本地的网页内容,设置获取小说名字和描述的正则规则。

网页内容

 

正则匹配设置

经过多次验证后最终正则规则设置如下。

示例如下:

# 正则匹配
import re
reg = re.compile('<div class="item">(.*?)</dl>', re.S)
div_data = reg.findall(data)
dic = {}
for div in div_data:
    # 标题
    title_reg = re.compile('<dt><span>.*?</span><a href=".*?">(.*?)</a>', re.S)
    titles = title_reg.search(div)
    title = titles.group(1)
    # 描述
    desc_reg = re.compile('<dd>(.*?)<\/dd>', re.S)
    descs = desc_reg.search(div)
    desc = descs.group(1)
    dic[title] = desc


for d2 in dic:
    print(d2, '=> ', dic[d2])

执行结果:

总结

本文为Python urllib类库爬虫更入门的一些操作和爬虫实例及源码。

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

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

相关文章

Springboot+Vue项目-基于Java+MySQL的教学资料管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

bite阶段性测试_数据结构

解决问题之前我们要了解什么是度&#xff0c;特别是二叉树中的度&#xff0c;和图论中的度的定义是不同的 什么是度&#xff1a; 在图论中&#xff0c;一个节点&#xff08;或称为顶点&#xff09;的“度”是指与该节点直接相连的边的数量。度是用来衡量一个节点与其他节点连接…

CSS移动端弹性布局

一级标题 二倍图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>背景图片</title><styl…

一个单例模式中使用std::unique_ptr引起的莫名其妙的COFF损坏的问题(未解决)

使用static std::unique_ptr和static std::shared_ptr都不行struct IElementAgendaEvents {//! Called to allow listeners to modify the agenda by adding/removing entries before applying tool operation. Return true if entries added or invalidated.virtual bool …

【机器学习】视觉基础模型的三维意识:前沿探索与局限

视觉基础模型的三维意识&#xff1a;前沿探索与局限 一、引言二、视觉基础模型的三维意识三、当前模型的局限性四、实验与结果五、总结与展望 大规模预训练的进展已经产生了具有强大能力的视觉基础模型。最近的模型不仅可以推广到任意图像的训练任务&#xff0c;而且它们的中间…

spring boot 基础案例【3】构建RESTful API与单元测试

教程1 案例教程 案例仓库 在线编程 教程2 基础教程 教程仓库 在线编程 本案例所在的仓库 本案例所在的文档 进入正文 1.文件目录 1. Chapter21Application.java 地址&#xff1a;chapter2-1/src/main/java/com/didispace/chapter21/Chapter21Application.java package com.d…

CSS @keyframes 动画:颜色变化、背景旋转与放大缩小

在CSS中&#xff0c;keyframes 是一个强大的工具&#xff0c;它允许我们创建复杂的动画效果。今天&#xff0c;我们将一起探索如何使用 keyframes 来实现颜色变化、背景旋转以及放大缩小的动画效果。 动画会在 2 秒内循环播放&#xff0c;并在不同的时间点改变盒子的背景颜色和…

【JVM】简述类加载器及双亲委派机制

双亲委派模型&#xff0c;是加载class文件的一种机制。在介绍双亲委派模型之前&#xff0c;我需要先介绍几种类加载器&#xff08;Class Loader&#xff09;。 1&#xff0c;类加载器 Bootstrap&#xff0c;加载lib/rt.jar&#xff0c;charset.jar等中的核心类&#xff0c;由…

VS code 同步odata服务

在做UI5得开发过程中&#xff0c;经常会出现odata需要更新 那么已经加载过得项目如何去跟新odata服务呢 可以通过如下步骤 1.右键打开应用信息 2.找到manage service models 3.点击编辑 4.选中 刷新并保存

前端发起网络请求的几种常见方式(XMLHttpRequest、FetchApi、jQueryAjax、Axios)

摘要 前端发起网络请求的几种常见方式包括&#xff1a; XMLHttpRequest (XHR)&#xff1a; 这是最传统和最常见的方式之一。它允许客户端与服务器进行异步通信。XHR API 提供了一个在后台发送 HTTP 请求和接收响应的机制&#xff0c;使得页面能够在不刷新的情况下更新部分内容…

【YOLOv9改进[Conv]】使用基于Haar的小波变换Down_wt处理替换模型结构中的Conv和ADown 实践

目录 一 基于Haar的小波变换 二 使用基于Haar的小波变换Down_wt处理替换模型结构中的Conv和ADown 实践 1 整体修改 2 配置文件 3 训练 三 报错处理 一 基于Haar的小波变换 Haar小波是最简单的小波形式之一&#xff0c;具有易于计算和实现的优点。使用二维离散小波变换&a…

TCP重传,滑动窗口,流量控制,拥塞控制

TCP重传&#xff0c;滑动窗口&#xff0c;流量控制&#xff0c;拥塞控制 TCP重传机制&#xff1a; 超时重传快速重传SACKD-SACK 通过序列号与确认应答判断是否要重传 超时重传&#xff1a; 超过指定时间没有收到确认应答报文&#xff0c;就会重发该数据 触发超时重传的情况…

k8s 资源组版本支持列表

1 kubernetes的资源注册表 kube-apiserver组件启动后的第一件事情是将Kubernetes所支持的资源注册到Scheme资源注册表中,这样后面启动的逻辑才能够从Scheme资源注册表中拿到资源信息并启动和运行API服务。 kube-apiserver资源注册分为两步:第1步,初始化Scheme资源注册表;…

【论文笔记】Training language models to follow instructions with human feedback A部分

Training language models to follow instructions with human feedback A 部分 回顾一下第一代 GPT-1 &#xff1a; 设计思路是 “海量无标记文本进行无监督预训练少量有标签文本有监督微调” 范式&#xff1b;模型架构是基于 Transformer 的叠加解码器&#xff08;掩码自注意…

【百度Apollo】探索自动驾驶:百度Apollo视觉感知模块的实践与创新

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、百度Apollo视觉感知模块概述二、启动感知模块步骤一&#xff1a;进入 Docker 环境并启动 Dreamview步骤二…

请编写函数fun,该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

我开始接单/兼职/搞副业/建设个人社区,为自己谋后路了。

我开始接单/兼职/搞副业/建设个人社区&#xff0c;为自己谋后路了。 简述 大家好&#xff0c;我是小荣&#xff0c;一个前端开发程序员。我最近开始在业余时间接私单了&#xff0c;也在想一些能够带来成长&#xff0c;收入的副业&#xff0c;主要也是为了自己谋后路&#xff…

ctfshow——SQL注入

文章目录 SQL注入基本流程普通SQL注入布尔盲注时间盲注报错注入——extractvalue()报错注入——updataxml()Sqlmap的用法 web 171——正常联合查询web 172——查看源代码、联合查询web 173——查看源代码、联合查询web 174——布尔盲注web 176web 177——过滤空格web 178——过…

【算法刷题 | 贪心算法09】4.30(单调递增的数字)

文章目录 16.单调递增的数字16.1题目16.2解法&#xff1a;贪心16.2.1贪心思路16.2.2代码实现 16.单调递增的数字 16.1题目 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的…

jenkins转载文本

基于Docker容器DevOps应用方案 企业业务代码发布系统 一、企业业务代码发布方式 1.1 传统方式 以物理机或虚拟机为颗粒度部署部署环境比较复杂&#xff0c;需要有先进的自动化运维手段出现问题后重新部署成本大&#xff0c;一般采用集群方式部署部署后以静态方式展现 1.2 容…