爬虫, 是一种自动化程序, 它能用于浏览互联网上的网页, 还能依据一定规则自动抓取网页内容, 其主要功能是从一个起始网址, 或者多个起始网址开始, 借助解析网页内容找到新链接, 接着继续访问这些新链接, 以此遍历整个网站, 或者互联网的一部分, 它在搜索引擎、数据挖掘、信息检索等领域有着广泛应用。

1 基础知识
互联网之上, 用于发布信息存在着两种主要方式, 其一乃是基于WEB浏览器的网页形式, 其二则是基于各类操作系统平台的客户端应用形式。
WEB发展得极为迅速 , 与之相关的通讯协议基本上都朝着HTTP靠拢 , 所以要获取信息 , 对于HTTP得有一定钻研和知悉。由于浏览器以及WEB服务器作为主流运用HTTP协议来进行通讯的客户端与服务端 , 因而也应当稍有了解 , 以便于鉴别哪些属于合法访问 ,并且清楚怎样获取用户所看到的数据。

HTTP 1.1
另有一部分应用是基于iOS、Linux等操作系统的, 这类应用通常需要了解操作系统的SDK, 又或者需要熟悉TCP/IP协议。对于一些私有协议, 能够利用类似网络嗅探的方式来获取的, 可参考之类等同于软件产品或者为开发库一般情况的内容。而大部分应用基本上是基于HTTP协议的, 就是这样。


要加快对数据进行采集、分析以及存储的速度, 那就需要展开并行计算, 因此对于线程、进程的概念得拥有一定程度的掌握, 另外也提供了异步机制, 其能够很好地理清解耦各个阶段的实现逻辑, 所以对异步机制以及异步编程框架得存有了解, 这其中涵盖了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())
获取数据
针对http的库, 存在内置的情况, 还存在外部组件库的情形。能够比较便利地凭借url去访问http服务。其中会默认对http头进行管理, 然而另有情况则不会, 在使用过程当中要格外留意一下(有可能一样的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颇为轻松地开发出一款与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。
对于数据库方面而言, 是能够重点予以掌握的。当然, 也能够直接去挑选和mysql、redis能够相匹配的库。不管是前者还是后者, 都是能够去组织语言询问一下AIGC的。
爬虫进阶
爬虫关联的技术要点相对地多, 得剖析通讯协议, 还要模拟运行环境, 甚而还要破解某些安全手段, 像验证码等。此处能够着重留意端侧的模拟工具, 比如说。此外对于中继这类而言也是相当重要的, 研习运用之类有益于剖析通讯协议, 以及明确数据获取的目标。
使用框架
总体讲, 框架的挑选相对简易, 缘由是发展态势佳。然而要是仅作初步尝试, 那能够思量简便的框架, 比如说, 他给出了界面设置, 负责管理爬虫工作。
参考资料 文小言、bito、豆包