16. python从入门到精通——Python网络爬虫

news2025/4/7 13:03:40

目录

什么是爬虫

优点

网络爬虫的常用技术

网络请求:有三个常用网络请求模块

Urllib模块:python原生系统中标准库模块

urllib中的子模块

urllib.parse.urlencode() 常用于进行 URL 的 get 请求参数拼接

Urllib3模块:Urllib模块的升级版

Requests模块:第三方模块

请求headers处理

网络超时

代理服务

解析html

常见python中解析html代码模块:

BeautifulSoup模块安装方法:

BeautifulSoup模块的使用  

爬虫的常用框架

Scrapy爬虫框架

搭建Scrapy爬虫框架

创建Scrapy项目

测试项目:爬取scrapy官方提供的测试网页 

实践项目:快手爬票 

运行效果


什么是爬虫

网络爬虫:又被称为网络蜘蛛、网络机器人。它可以实现按照指令的规则或程序的算法自动浏览网络并且获取网络中的信息

优点

        快速开发

        跨平台

        解释性

        多种网络爬虫框架

示例:

import urllib.request
response = urllib.request.urlopen('https://www.baidu.com/')
print(response.read().decode('utf-8'))

网络爬虫的常用技术

网络请求:有三个常用网络请求模块

Urllib模块:python原生系统中标准库模块

urllib中的子模块

模块名称

说明

urllib.request

该模块定义了打开URL (主要是HTTP)的方法和类,例如,身 份验证、重定向、cookie等等

urllib.error

该模块中主要包含异常类,基本的异常类是URLError

urllib.parse

该模块定义的功能分为两大类:URL解析和URL引用

urllib.robotparser

该模块用于解析robots.txt文件。

#robots.txt文件:我们在爬取一个网站时,首先会访问网站根目录下的这个文件。该文件会设置爬虫规则来告诉爬虫哪些信息可以爬取,如果没有这个文件默认可以爬取所有内容

urllib.parse.urlencode() 常用于进行 URL 的 get 请求参数拼接

    函数原型:

        函数原型
            def urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)

                #encoding=None    编码

                #errors=None    错误默认值

补充:urllib.request详细介绍

示例1

import urllib.parse

query = {}  # 空dict
print(urllib.parse.urlencode(query))
query = {'a': 1, 'b': 2}  # dict
print(urllib.parse.urlencode(query))
query = (('a', 1), ('b', 2))  # 二元素的tuple序列
print(urllib.parse.urlencode(query))
query = (('a', [1, 2]), ('b', [2, 3]))  # 值是序列,且doseq为True,单独转换
print(urllib.parse.urlencode(query, doseq=True))
query = {b'a': b'1', b'b': b'2'}  # 字节类型
print(urllib.parse.urlencode(query))
# 
# a=1&b=2
# a=1&b=2
# a=1&a=2&b=2&b=3
# a=1&b=2

示例2

import urllib.parse

url = 'http://www.baidu.com/s'
query = {
    'wd': 'Python3标准库',
    'ie': 'UTF-8'
}
print(url + '?' + urllib.parse.urlencode(query))
#
#http://www.baidu.com/s?wd=Python3%E6%A0%87%E5%87%86%E5%BA%93&ie=UTF-8

示例3:模拟post请求

import urllib.request
import urllib.parse
data = bytes(urllib.parse.urlencode({'word':'hellow'}),encoding='utf-8')
respond = urllib.request.urlopen('http://httpbin.org/post',data=data)
http = respond.read()
print(http)
#
#b'{\n  "args": {}, \n  "data": "", \n  "files": {}, \n  "form": {\n    "word": "hellow"\n  }, \n  "headers": {\n    "Accept-Encoding": "identity", \n    "Content-Length": "11", \n    "Content-Type": "application/x-www-form-urlencoded", \n    "Host": "httpbin.org", \n    "User-Agent": "Python-urllib/3.6", \n    "X-Amzn-Trace-Id": "Root=1-64a3fe11-542cddfb499ab3800ce32f36"\n  }, \n  "json": null, \n  "origin": "123.57.85.224", \n  "url": "http://httpbin.org/post"\n}\n'

Urllib3模块:Urllib模块的升级版

官网

相对于Urllib库新增了很多特性和功能:

        线程安全

        使用大部分编码上传文件

        支持连接池

        100%的测试覆盖率

安装:

    python -m pip install urllib3

Python urllib3模块详解

示例:

import urllib3
#创建PoolManager对象,用来处理与线程的连接以及线程安全
http = urllib3.PoolManager()
#发送网络请求
response = http.request('POST','http://httpbin.org/post',fields={'word':'hello'})
print(response.data.decode())

Requests模块:第三方模块

官网

功能特性:

        自动内容解码

        分块请求

        连接超时

        文件分块上传

        自动解压 

requests模块详解

示例:

import requests
response = requests.get('http://www.baidu.com/')
print('获取响应状态码',response.status_code)
print('获取响应头',response.headers)
print('获取响应内容',response.content.decode('utf-8'))

请求headers处理

爬取数据时网站经常采用反爬虫设置拒绝访问,此时可以通过请求headers处理的方式模拟浏览器进行网页的请求

请求头部信息:

 示例:伪装为浏览器

        测试网站:https://www.whatismyip.com/

        查看浏览器类型:

            打开网址→F12 打开网页调试 →找到Network→刷新网页→找到User-Agent

        代码: 

import requests
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'}
responde = requests.get('https://www.whatismyip.com/',headers = headers)
print(responde.content.decode('utf-8'))

网络超时

        网络超时:在设置的时间内未收到请求的响应

        出现原因:

                网络断开

                网络不稳定

                网络堵塞

                网络速度慢

示例

        打印所有异常

import requests
for i in range(0,5):
    try:
        response = requests.get('http://httpbin.org/',timeout=1)
        print('获取响应状态码',response.status_code)
    except Exception as e:
        print('异常',e)

        优化:导入超时等异常模块后可以进行判断后打印

import requests
#导入可以捕获超时、HTTP协议异常、请求异常的模块
from requests.exceptions import ReadTimeout,HTTPError,RequestException
for i in range(0,5):
    try:
        response = requests.get('http://httpbin.org/',timeout=2)
        print('获取响应状态码',response.status_code)
    except ReadTimeout:
        print('timeout')
    except HTTPError:
        print('httperror')
    except RequestException:
        print('reqerror')

代理服务

应用场景:在爬取网页内容时多次爬取后会出现403或要求输入验证码。这是因为自己的IP被爬取的网站所发现,设置了代理IP后就相当于隐藏了爬虫

proxies参数:代替本机的IP地址, 去对接网络的IP地址;其作用是,隐藏真实IP,避免被目标网站封掉。

需要借助于代理IP网站

        网址:国内高匿HTTP免费代理IP_代理IP_HTTP代理 - 快代理

        需要寻找存活时间比较长的代理IP然后填入其中的代理IP和端口

示例:

import requests
from fake_useragent import UserAgent

url = "http://httpbin.org/get"  # 测试网站url地址
headers = {'User-Agent': UserAgent().random}  # 请求头
proxies = {
    'http': 'http://222.74.73.202:42055',
    'https': 'https://222.74.73.202:42055'
} 
html = requests.get(url=url, headers=headers, proxies=proxies).text  # 获取响应内容
print(html)
#
# {
#   "args": {}, 
#   "headers": {
#     "Accept": "*/*", 
#     "Accept-Encoding": "gzip, deflate", 
#     "Host": "httpbin.org", 
#     "User-Agent": "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.8810.3391 Safari/537.36 Edge/18.14383", 
#     "X-Amzn-Trace-Id": "Root=1-64ad4157-0c5187c3267e127a59fcbda0"
#   }, 
#   "origin": "222.74.73.202",     #表示访问地址
#   "url": "http://httpbin.org/get"
# }

解析html

常见python中解析html代码模块:

LXML模块:解析速度快,但是需要安装C语言库

Requests-HTML模块:第三方模块

HtmlParser模块:python标准库模块。执行速度适中但容错能力较差

BeautifulSoup模块:不仅支持python标准库的html解析器还支持很多第三方解析器,其中还包含LXML解析器

BeautifulSoup模块安装方法:

         pip install bs4

源码安装:

        源码地址:

            https://www.crummy.com/software/BeautifulSoup/bs4/download/

        安装源码:

            python setup.py install 

BeautifulSoup模块的使用  

官方文档

需要安装LXML解析器

>>>pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple/

示例1:分析html代码    

from bs4 import BeautifulSoup
html_doc = """<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""
soup = BeautifulSoup(html_doc,features='lxml')#选择lxml解析器解析html_doc
print(soup.title)
print(soup.prettify())#格式化

示例2:读取网页文件进行解析

file = open('test.html','w')
file.write("""<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
""")
file.close()
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html'),features='lxml')
print(soup.title)

示例3:爬取并解析百度

from bs4 import BeautifulSoup
import requests
response = requests.get('http://news.baidu.com')
soup = BeautifulSoup(response.text,features='lxml')
print(soup.title)

爬虫的常用框架

Scrapy爬虫框架:
        Scrapy框架是一套比较成熟的Python爬虫框架,简单轻巧,并且非常方便,可以高效率地爬取Web页面并从页面中提取结构化的数据。
Crawley爬虫框架:
        Crawley也是Python开发出的爬虫框架,该框架致力于改变人们从互联网中提取数据的方式。
PySpider爬虫框架:
        相对于Scrapy框架而言,PySpider框架还是新秀。PySpider框架釆用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器, 任务监视器,项目管理器以及结果查看器

Scrapy爬虫框架

搭建Scrapy爬虫框架

安装Twisted模块

         twisted:异步网络框架,可加快下载速度。优点是用少量的代码实现快速的抓取。

         下载:由于scrapy需要twisted的环境,我们直接去下载whl文件根据自己的Python版本选择

                下载地址

        下载完之后按住shift然后鼠标右键打开命令行

                pip install twisted_iocpsupport-1.0.2-cp310-cp310-win_amd64.whl

安装scrapy框架

pip install scrapy

安装pywin32

pywin32:是一个第三方模块库,它直接包装了几乎所有windowsAPI ,可以方便的从python直接调用

pip install pywin32       

测试:

        命令行执行:scrapy       

创建Scrapy项目

进入要创建项目的路径然后shift鼠标右击打开命令行窗口:

        scrapy startproject scrapyDemo

                #scrapyDemo:自定义项目名

然后使用PyCharm打开此项目

测试项目:爬取scrapy官方提供的测试网页 

地址:https://quotes.toscrape.com/page/1/

补充:

        yield:带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代。

        yield详解

        Scrapy(爬虫框架)中,Spider类中parse()方法的工作机制

示例1:需要要命令行启动定义的爬虫

import scrapy  # 导入框架


class QuotesSpider(scrapy.Spider):
    name = "quotes"  # 定义爬虫名称

    def start_requests(self):
        # 设置爬取目标的地址
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        # 获取所有地址,有几个地址发送几次请求
        for url in urls:
            # 构造请求,scrapy.Request(url,callback)
            #callback:表示当前的url的响应交给哪个函数去处理,callback=self.parse一般都是交给自身的parse函数处理
            yield scrapy.Request(url=url, callback=self.parse)
    #处理结果
    #parse(self,response):当请求url返回网页没有指定回调函数,默认的Request对象的回调函数,用来处理网页返回的response,和生成的Item或者Request对象
    def parse(self, response):
        # 获取页数
        page = response.url.split('/')[-2]
        # 根据页数设置文件名称
        filename = 'quotes-%s.html' %page
        #以写入文件模式打开文件,如果没有该文件将创建该文件
        with open(filename, 'wb') as f:
            # 向文件中写入获取的html代码
            f.write(response.body)
        # 输出保存文件的名称
        self.log('Saved file %s' % filename)

        最后命令行启动定义的爬虫名字:

        >>>scrapy crawl quotes

示例2:代码中设置程序执行入口,并设置启动爬虫

import scrapy  # 导入框架


class QuotesSpider(scrapy.Spider):
    name = "quotes"  # 定义爬虫名称

    def start_requests(self):
        # 设置爬取目标的地址
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        # 获取所有地址,有几个地址发送几次请求
        for url in urls:
            # 发送网络请求
            yield scrapy.Request(url=url, callback=self.parse)
    #处理结果
    def parse(self, response):
        # 获取页数
        page = response.url.split('/')[-2]
        # 根据页数设置文件名称
        filename = 'quotes-%s.html' %page
        #以写入文件模式打开文件,如果没有该文件将创建该文件
        with open(filename, 'wb') as f:
            # 向文件中写入获取的html代码
            f.write(response.body)
        # 输出保存文件的名称
        self.log('Saved file %s' % filename)
#导入CrawlerProcess类
from scrapy.crawler import CrawlerProcess
#获取项目的设置信息
from scrapy.utils.project import get_project_settings

if __name__ == '__main__':
    #创建CrawlerProcess类对象,并将获取的设置信息传入
    process = CrawlerProcess(get_project_settings())
    #设置需要启动的爬虫名字
    process.crawl('quotes')
    #启动爬虫
    process.start()

实践项目:快手爬票 

运行效果

通过UI编辑器QT实现

 

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

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

相关文章

paramiko模块使用(2)

远程查看服务器资源使用情况 单机实现 import paramiko# 定义远程服务器的连接信息 hostname 192.168.2.198 username root password 123456# 创建SSH客户端对象 client paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy())try:# 连接到…

力扣刷题SQL-197. 上升的温度---分步解题

表&#xff1a; Weather ------------------------ | Column Name | Type | ------------------------ | id | int | | recordDate | date | | temperature | int | ------------------------ id 是这个表的主键 该表包含特定日期的温度信息编…

qemu搭建arm环境以及文件共享

几乎完全参照该文章 使用QEMU搭建ARM64实验环境 - 简书 ubuntu 14.04&#xff0c;linux3.16&#xff0c; busybox-1.31.0 arm-linux-gnueabi-gcc -v linux3.16以及busybox下载安装可参考链接 Ubuntu14.04安装qemu&#xff0c;运行linux-3.16gdb调试_qemu 安装 ubuntu 14_这个我…

项目开启启动命令整合

启动RabbitMQ管理插件 1.启动 RabbitMQ 管理插件。 rabbitmq-plugins enable rabbitmq_management rabbitmq-server # 直接启动&#xff0c;如果关闭窗⼝或需要在该窗⼝使⽤其他命令时应⽤就会停⽌ rabbitmq-server -detached # 后台启动 rabbitmq-server start # 启⽤服务 rab…

【亲测可用】安装Qt提示“无法下载存档 http://download.qt.io/online/qtsdkrepository...“

下载Qt安装程序exe之后&#xff0c;一般直接双击运行然后&#xff0c;注册登录后&#xff0c;到了第三步【安装程序】时&#xff0c;进行远程检索文件总会卡在这里&#xff0c;无法进行到下一步。报错如下&#xff1a; 解决办法&#xff1a; 关闭安装程序&#xff0c;然后&…

一百三十二、ClickHouse——ClickHouse建表时默认字段非空导致数据问题

一、ClickHouse建表问题 由于ClickHouse建表时默认字段非空 &#xff08;一&#xff09;建表语句 &#xff08;二&#xff09;查看字段属性 ClickHouse建表时一般情况下直接默认字段非空 &#xff08;三&#xff09;导致问题 所以这就导致一般情况下&#xff0c;一些字段的…

iphone新机官网验机流程

苹果官网验机流程 进入苹果官网&#xff0c;找到技术支持&#xff0c;进入“查看保障服务和支持期限“页面&#xff0c;输入要查询的机器的序列号&#xff0c;就可以查询了。 苹果官网验机入口&#xff1a;https://checkcoverage.apple.com/ 输入iphone序列号进行验机&#xff…

小程序体验版上线注意事项

1.接口域名必须是https&#xff0c;有ssh证书。不能用ip地址。 2.需要在微信公众平台进行配置 微信公众平台->开发-> 开发管理->开发设置 对服务器域名和业务域名进行配置对业务域名进行配置时&#xff0c;需要下载校验文件&#xff0c;放在域名根目录下

力扣刷题27.移除元素(Accept03)

力扣刷题 代码随想录数组 3.移除元素 力扣27. 移除元素 方法一&#xff1a;暴力解决法 1. 思路 两层嵌套循环遍历数组&#xff0c;内层循环主要是当第一层循环遍历到的元素等于要移除的元素的值的时候&#xff0c;其后的元素依次向前挪动一个位置&#xff08;覆盖要删除的…

计科web常见错误排错【HTTP状态404、导航栏无法点开、字符乱码及前后端数据传输呈现、jsp填写的数据传到数据库显示null、HTTP状态500】

web排错记录 在使用javaweb的过程中会出现的一些错误请在下方目录查找。 目录 错误1&#xff1a;HTTP状态404——未找到 错误2&#xff1a;导航栏下拉菜单无法点开的问题 错误3&#xff1a;字符乱码问题 错误4&#xff1a;jsp网页全部都是&#xff1f;&#xff1f;&#x…

科技云报道:边缘云赛道开启,谁能成为首个“出线”厂商?

科技云报道原创。 每一轮底层技术变革&#xff0c;都会带来全新的商业机遇。随着万物智联时代到来&#xff0c;大量数据产生的源头由传统的中心化向分散数据源变革&#xff0c;越来越多云边协同场景的出现&#xff0c;使得边缘云成为计算领域数据处理的新范式之一。 自2020年…

CHI协议保序之Compack保序

一致性系统中&#xff0c;使用三种保序方式&#xff1b; Completion ack response ⭕Completion acknowledgment&#xff1a; □ 该域段主要是用来&#xff0c; □ 决定 RN 发送的 trans&#xff0c;与其他 RN 发送的命令产生的 SNP 之间的顺序&#xff1b; …

[VUE]Element_UI 实现TreeSelect 树形选择器

文章目录 前言1、安装2、引用3、使用 前言 最近在做一个人员管理系统&#xff0c;在增改用户信息时&#xff0c;可能会设置用户所在的部门&#xff0c;因为部门是多级的&#xff0c;于是想到用Element_UI的TreeSelect组件实现 效果&#xff1a; 1、安装 npm install --save…

蓝桥杯专题-真题版含答案-【牌型种数】【煤球数目】【寒假作业】【奖券数目】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

如何动态修改 spring aop 切面信息?让自动日志输出框架更好用

业务背景 很久以前开源了一款 auto-log 自动日志打印框架。 其中对于 spring 项目&#xff0c;默认实现了基于 aop 切面的日志输出。 但是发现一个问题&#xff0c;如果切面定义为全切范围过大&#xff0c;于是 v0.2 版本就是基于注解 AutoLog 实现的。 只有指定注解的类或…

pytest常用执行参数详解

1. 查看pytest所有可用参数 我们可以通过pytest -h来查看所有可用参数。 从图中可以看出&#xff0c;pytest的参数有很多&#xff0c;下面是归纳一些常用的参数&#xff1a; -s&#xff1a;输出调试信息&#xff0c;包括print打印的信息。-v&#xff1a;显示更详细的信息。…

GAN在图像超分辨领域的应用

本篇博客介绍了对抗生成网络GAN在图像超分辨领域的应用&#xff0c;包括(SRGAN, ESRGAN, BSRGAN, Real-ESRGAN),详细介绍了论文内容&#xff0c;方法&#xff0c;网络结构并对其做了相关总结。相关GAN原理的介绍大家可以查看我之前的几篇博客&#xff0c;链接如下&#xff1a;生…

从用户的角度谈GPT时代技术突破的两大关键逻辑

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

API接口:如何通过使用手机归属地查询

随着手机普及率的不断增加&#xff0c;手机号码的信息查询也成为了一个非常实用的功能。本文将介绍如何通过使用手机归属地查询API接口实现查询手机号码所在地的功能。 首先&#xff0c;我们需要一个可以查询手机号码所在地的API接口。目前市面上有很多免费或付费的API接口可供…

MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点6:MySQL Enterprise Monitor之Query Analyzer

文章目录 MySQL 8.0 OCP (1Z0-908) 考点精析-性能优化考点6&#xff1a;MySQL Enterprise Monitor之Query AnalyzerMySQL Enterprise Monitor之Query AnalyzerQuery Response Time index (QRTi)例题例题1: Query Analyzer答案与解析1 参考 【免责声明】文章仅供学习交流&#x…