百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python开发爬虫的常用技术架构(python爬虫技术深入理解原理技术与开发电子档)

off999 2024-10-26 12:11 22 浏览 0 评论

爬虫(Web Crawler 或 Web Spider)是一种自动化程序,用于浏览互联网上的网页,并根据一定的规则自动抓取网页内容。爬虫的主要功能是从一个或多个起始网址开始,通过解析网页内容找到新的链接,然后继续访问这些新链接,从而遍历整个网站或者互联网的一部分。爬虫广泛应用于搜索引擎、数据挖掘、信息检索等领域。

1 基础知识

互联网上用来发布信息主要有两种,一种是基于WEB浏览器的网页,还有一种是基于各类操作系统平台的客户端应用。

因为WEB发展迅速,相关通讯协议基本都向HTTP靠齐,所以要获取信息HTTP需要有一定了解。而浏览器和WEB服务器作为主流使用HTTP协议通讯的客户端和服务端,也应该略有了解,便于识别哪些是合法访问,以及如何获得用户看到的数据。



另一部分基于Android、iOS、HarmonyOS、WIndows、Linux等操作系统的应用,这类则需要了解操作系统的SDK或者TCP/IP协议。对于一些私有协议,可以使用类似网络嗅探的方式去获取,可参考Wireshark、Winpcap之类的软件产品或者开发库。而对于大部分应用基本还是基于HTTP的协议。




如果要加快采集、分析、存储数据的速度,需要并行计算。所以线程、进程的概念要有一定的掌握。另外python提供了异步机制,能很好的解耦各个阶段的实现逻辑,所以异步机制和异步编程框架要有了解。包括asyncio和twist框架,如:

import asyncio

async def read_file(file_path):
    with open(file_path, 'r') as f:
        return f.read()

async def main():
    file_content = await read_file('example.txt')
    print(file_content)

asyncio.run(main())

获取数据

python3对http的库有内置的urllib,也有第外部组件库urllib3、request。可以较方便地通过url访问http服务。期中request会默认管理http头和cookie,urllib3则不会,使用中要特别注意下(可能相同的url,有不同的返回值)。

import sys  
  
def test_urllib(url):
    import urllib.request
    targetUrl = 'https://www.baidu.com'

    if url is not None and url.startswith('http'):
        targetUrl = url

    print(targetUrl)

    response = urllib.request.urlopen(targetUrl)
    html = response.read()
    print(html)

def test_urllib3(url):
    import urllib3
    targetUrl = 'https://www.baidu.com'

    if url is not None and url.startswith('http'):
        targetUrl = url

    http = urllib3.PoolManager()
    response = http.request('GET', targetUrl)
    html = response.data
    print(html)

print(len(sys.argv))

for i, arg in enumerate(sys.argv):
    print(f"{i}: {arg}")
    url = arg
    if url is not None and url.startswith('http'):
        test_urllib(arg)
        test_urllib3(arg)

对于一些非http协议的,需要个案考虑。这里不展开,但是可考虑一个并行框架twist,可帮助管理并发任务,提高开发效率。例如我们可以用twsit很轻松开发一个client和sever程序。

# server.py
from twisted.internet import protocol, reactor
from twisted.protocols import basic

class Echo(basic.LineReceiver):
    def connectionMade(self):
        self.sendLine(b'Welcome to the Twisted Echo Server!')

    def lineReceived(self, line):
        self.sendLine(line)  # Echo back the received line

class EchoFactory(protocol.Factory):
    def buildProtocol(self, addr):
        return Echo()

if __name__ == '__main__':
    port = 8000
    reactor.listenTCP(port, EchoFactory())
    print(f'Server running on port {port}...')
    reactor.run()

# client.py
from twisted.internet import reactor, protocol
from twisted.protocols import basic

class EchoClient(basic.LineReceiver):
    def connectionMade(self):
        self.sendLine(b'Hello, Server!')

    def lineReceived(self, line):
        print(f'Received from server: {line.decode()}')
        self.transport.loseConnection()  # Close the connection after receiving data

class EchoClientFactory(protocol.ClientFactory):
    protocol = EchoClient

    def clientConnectionFailed(self, connector, reason):
        print(f'Connection failed: {reason}')
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print(f'Connection lost: {reason}')
        reactor.stop()

if __name__ == '__main__':
    server_address = 'localhost'
    server_port = 8000
    factory = EchoClientFactory()
    reactor.connectTCP(server_address, server_port, factory)
    reactor.run()


分析数据

这里不赘述,可按照思维导图的关键字,借助aigc工具逐个学习。特别关注下xml、json解析器,在爬虫的日常工作中,这些必不可少。

存储数据

存储数据到文件可关注二进制文件,例如图片、音乐、视频等,以及办公软件如excel、word,ppt等,还有常规的标准格式文件xml和json。

数据库方面可重点掌握sqlalchemy。当然也可以直接选择与mysql、redis、mongodb匹配的库。都可组织语言问问AIGC

爬虫进阶

爬虫涉及到的技术点较多,需要分析通讯协议和模拟运行环境,甚至还要破解一些安全手段(如验证码)等。这里可重点关注端侧的模拟工具,如selenium,appnium。另外对于中继这类也很重要,学习使用fiddler之类有助于分析通讯协议,和明确数据获取的目的。

使用框架

总体来说框架的选择较简单,因为scrapy发展的很好。但是如果只是小试牛刀,可以考虑简单的框架,如crawley,他提供了界面,管理爬虫。



参考资料

  1. Wireshark https://www.wireshark.org/
  2. WinPcap https://www.winpcap.org/
  3. Http https://www.rfc-editor.org/rfc/rfc2616.pdf
  4. 文小言、bito、豆包

相关推荐

面试官:来,讲一下枚举类型在开发时中实际应用场景!

一.基本介绍枚举是JDK1.5新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错...

一日一技:11个基本Python技巧和窍门

1.两个数字的交换.x,y=10,20print(x,y)x,y=y,xprint(x,y)输出:102020102.Python字符串取反a="Ge...

Python Enum 技巧,让代码更简洁、更安全、更易维护

如果你是一名Python开发人员,你很可能使用过enum.Enum来创建可读性和可维护性代码。今天发现一个强大的技巧,可以让Enum的境界更进一层,这个技巧不仅能提高可读性,还能以最小的代价增...

Python元组编程指导教程(python元组的概念)

1.元组基础概念1.1什么是元组元组(Tuple)是Python中一种不可变的序列类型,用于存储多个有序的元素。元组与列表(list)类似,但元组一旦创建就不能修改(不可变),这使得元组在某些场景...

你可能不知道的实用 Python 功能(python有哪些用)

1.超越文件处理的内容管理器大多数开发人员都熟悉使用with语句进行文件操作:withopen('file.txt','r')asfile:co...

Python 2至3.13新特性总结(python 3.10新特性)

以下是Python2到Python3.13的主要新特性总结,按版本分类整理:Python2到Python3的重大变化Python3是一个不向后兼容的版本,主要改进包括:pri...

Python中for循环访问索引值的方法

技术背景在Python编程中,我们经常需要在循环中访问元素的索引值。例如,在处理列表、元组等可迭代对象时,除了要获取元素本身,还需要知道元素的位置。Python提供了多种方式来实现这一需求,下面将详细...

Python enumerate核心应用解析:索引遍历的高效实践方案

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。根据GitHub代码分析统计,使用enumerate替代range(len())写法可减少38%的索引错误概率。本文通过12个生产...

Python入门到脱坑经典案例—列表去重

列表去重是Python编程中常见的操作,下面我将介绍多种实现列表去重的方法,从基础到进阶,帮助初学者全面掌握这一技能。方法一:使用集合(set)去重(最简单)pythondefremove_dupl...

Python枚举类工程实践:常量管理的标准化解决方案

本文通过7个生产案例,系统解析枚举类在工程实践中的应用,覆盖状态管理、配置选项、错误代码等场景,适用于Web服务开发、自动化测试及系统集成领域。一、基础概念与语法演进1.1传统常量与枚举类对比#传...

让Python枚举更强大!教你玩转Enum扩展

为什么你需要关注Enum?在日常开发中,你是否经常遇到这样的代码?ifstatus==1:print("开始处理")elifstatus==2:pri...

Python枚举(Enum)技巧,你值得了解

枚举(Enum)提供了更清晰、结构化的方式来定义常量。通过为枚举添加行为、自动分配值和存储额外数据,可以提升代码的可读性、可维护性,并与数据库结合使用时,使用字符串代替数字能简化调试和查询。Pytho...

78行Python代码帮你复现微信撤回消息!

来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。[导读]Python曾经对我说:"时日不多,赶紧用Python"。于是看...

登录人人都是产品经理即可获得以下权益

文章介绍如何利用Cursor自动开发Playwright网页自动化脚本,实现从选题、写文、生图的全流程自动化,并将其打包成API供工作流调用,提高工作效率。虽然我前面文章介绍了很多AI工作流,但它们...

Python常用小知识-第二弹(python常用方法总结)

一、Python中使用JsonPath提取字典中的值JsonPath是解析Json字符串用的,如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的,使用jsonpat...

取消回复欢迎 发表评论: