如何入门Python爬虫?看看这位硅谷程序员怎么说?

尚硅谷2021版Python爬虫笔记整理 笔记是用心整理的,发出来希望和大家一起学习! 有错误欢迎指正!!! 尚硅谷python爬虫(一)-Urllib 尚硅谷python爬虫(一)-urllib_D_lullaby的博客-优快云博客 尚硅谷python爬虫(二)-解析方法 尚硅谷python爬虫(二)-解析方法_D_lullaby的博客-优快云博客 尚硅谷python爬虫(三)-selenium 尚硅谷python爬虫(三)-selenium_D_lullaby的博客-优快云博客 尚硅谷python爬虫(四 阅读详情

网页“入门”是良好的动机,但是可能作用缓慢。如果你手里或者脑子里有一个项目,那么实践起来你会被目标驱动,而不会像学习模块一样慢慢学习。

另外如果说知识体系里的每一个知识点是图里的点,依赖关系是边的话,那么这个图一定不是一个有向无环图

。因为学习A的经验可以帮助你学习B。因此,你不需要学习怎么样“入门”,因为这样的“入门”点根本不存在!你需要学习的是怎么样做一个比较大的东西,在这个过程中,你会很快地学会需要学会的东西的。当然,你可以争论说需要先懂python,不然怎么学会python做爬虫呢?但是事实上,你完全可以在做这个爬虫的过程中学习python :D

看到前面很多答案都讲的“术”——用什么软件怎么爬,那我就讲讲“道”和“术”吧——爬虫怎么工作以及怎么在python实现。

先长话短说summarize一下:

你需要学习

  1. 基本的爬虫工作原理
  2. 基本的http抓取工具,scrapy
  3. Bloom Filter:
  4. 如果需要大规模网页抓取

,你需要学习分布式爬虫

  1. 的概念。其实没那么玄乎,你只要学会怎样维护一个所有集群机器能够有效分享的分布式队列就好。最简单的实现是python-rq:           这里就不挂链接了
  2. rq和Scrapy的结合:这里就不挂链接了
  3. 后续处理,网页析取( 这里就不挂链接了),存储(Mongodb)

以下是短话长说:

说说当初写的一个集群爬下整个豆瓣的经验吧。

1)首先你要明白爬虫怎样工作。
想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧。

在人民日报的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了“国内新闻”那个页面。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上。

突然你发现, 在国内新闻这个页面上,有一个链接链回“首页”。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊。所以,你需要用你的脑子,存下你已经看过的页面地址。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址。如果去过,那就别去了。

好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页。

那么在python里怎么实现呢?

很简单

import Queue

initial_page = "http://www.renminribao.com"

url_queue = Queue.Queue()
seen = set()

seen.insert(initial_page)
url_queue.put(initial_page)

while(True): #一直进行直到海枯石烂
    if url_queue.size()>0:
        current_url = url_queue.get()    #拿出队例中第一个的url
        store(current_url)               #把这个url代表的网页存储好
        for next_url in extract_urls(current_url): #提取把这个url里链向的url
            if next_url not in seen:      
                seen.put(next_url)
                url_queue.put(next_url)
    else:
        break

写得已经很伪代码了。

所有的爬虫的backbone

都在这里,下面分析一下为什么爬虫事实上是个非常复杂的东西——搜索引擎公司通常有一整个团队来维护和开发。

2)效率
如果你直接加工一下上面的代码直接运行的话,你需要一整年才能爬下整个豆瓣的内容。更别说Google这样的搜索引擎需要爬下全网的内容了。

问题出在哪呢?需要爬的网页实在太多太多了,而上面的代码太慢太慢了。设想全网有N个网站,那么分析一下判重的复杂度就是N*log(N),因为所有网页要遍历一次,而每次判重用set的话需要log(N)的复杂度。OK,OK,我知道python的set实现是hash——不过这样还是太慢了,至少内存使用效率不高。

通常的判重做法是怎样呢?Bloom Filter. 简单讲它仍然是一种hash

的方法,但是它的特点是,它可以使用固定的内存(不随url的数量而增长)以O(1)的效率判定url是否已经在set中。可惜天下没有白吃的午餐,它的唯一问题在于,如果这个url不在set中,BF可以100%确定这个url没有看过。但是如果这个url在set中,它会告诉你:这个url应该已经出现过,不过我有2%的不确定性。注意这里的不确定性在你分配的内存足够大的时候,可以变得很小很少。一个简单的教程:​​​​​​​这里就不挂链接了

注意到这个特点,url如果被看过,那么可能以小概率重复看一看(没关系,多看看不会累死)。但是如果没被看过,一定会被看一下(这个很重要,不然我们就要漏掉一些网页了!)。 [IMPORTANT: 此段有问题,请暂时略过]

好,现在已经接近处理判重最快的方法了。另外一个瓶颈——你只有一台机器。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈的话,那么你只有加快这个速度。用一台机子不够的话——用很多台吧!当然,我们假设每台机子都已经进了最大的效率——使用多线程(python的话,多进程吧)。

3)集群化抓取
爬取豆瓣的时候,我总共用了100多台机器昼夜不停地运行了一个月。想象如果只用一台机子你就得运行100个月了...

那么,假设你现在有100台机器可以用,怎么用python实现一个分布式的爬取算法呢?

我们把这100台中的99台运算能力较小的机器叫作slave,另外一台较大的机器叫作master,那么回顾上面代码中的url_queue,如果我们能把这个queue放到这台master机器上,所有的slave都可以通过网络跟master联通,每当一个slave完成下载一个网页,就向master请求一个新的网页来抓取。而每次slave新抓到一个网页,就把这个网页上所有的链接送到master的queue里去。同样,bloom filter也放到master上,但是现在master只发送确定没有被访问过的url给slave。Bloom Filter放到master的内存里,而被访问过的url放到运行在master上的Redis里,这样保证所有操作都是O(1)。(至少平摊是O(1),Redis的访问效率见这里就不挂链接了)

考虑如何用python实现:
在各台slave上装好scrapy,那么各台机子就变成了一台有抓取能力的slave,在master上装好Redis和rq用作分布式队列。

代码于是写成

#slave.py

current_url = request_from_master()
to_send = []
for next_url in extract_urls(current_url):
    to_send.append(next_url)

store(current_url);
send_to_master(to_send)

#master.py
distributed_queue = DistributedQueue()
bf = BloomFilter()

initial_pages = "www.renmingribao.com"

while(True):
    if request == 'GET':
        if distributed_queue.size()>0:
            send(distributed_queue.get())
        else:
            break
    elif request == 'POST':
        bf.put(request.url)

好的,其实你能想到,有人已经给你写好了你需要的:有向无环图

4)展望及后处理
虽然上面用很多“简单”,但是真正要实现一个商业规模可用的爬虫并不是一件容易的事。上面的代码用来爬一个整体的网站几乎没有太大的问题。

但是如果附加上你需要这些后续处理,比如

  1. 有效地存储(数据库应该怎样安排)
  2. 有效地判重(这里指网页判重,咱可不想把人民日报和抄袭它的​​​​​​​人民日报
  1. 有效地信息抽取(比如怎么样抽取出网页上所有的地址抽取出来,“朝阳区奋进路中华道”),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛...
  2. 及时更新(预测这个网页多久会更新一次)
  3. 有效地信息抽取(比如怎么样抽取出网页上所有的地址抽取出来,“朝阳区奋进路中华道”),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛...
  4. 及时更新(预测这个网页多久会更新一次)

如你所想,这里每一个点都可以供很多研究者十数年的研究。虽然如此,
“路漫漫其修远兮,吾将上下而求索”。

所以,不要问怎么入门,直接上路就好了:)


 

python爬虫学习笔记一(基本概念&urllib基础) 解释1:通过程序,根据URL进行爬取网页,获取有用信息> 解释2:使用程序模拟浏览器,向服务器发送请求,获取相应信息。 阅读详情

相关推荐

踩坑ubuntu24.04 编译vtk9.3.1的安卓版本

NDK官方明确废弃了旧版 armeabi ABI,强制使用armeabi-v7a或arm64-v8a。错误信息显示你的构建系统仍在使用超级构建(superbuild)模式,并且内部引用了已不再支持的。生成的合并库: $(pwd)/libvtk_combined.a"超级构建过程可能内部未充分考虑现代NDK变化导致内部配置ARM老ABI,重复失败。echo "正在提取所有.o文件..."echo "合并前所有库的总大小:"# 提取所有.a文件中的.o文件。echo "创建合并库..."

zhangyihu321的专栏 1891

Python爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人)就是模拟浏览器发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。

FGGFFoj的博客 4462

ClickHouse集群扩容实战:用clickhouse-copier搞定数据迁移与分片重平衡

本文详细介绍了使用clickhouse-copier工具实现ClickHouse集群从3分片到5分片的平滑扩容实战。通过分片级并行处理、原子性保证等核心机制,该工具能高效完成数据迁移与分片重平衡,同时保持服务连续性。文章涵盖集群拓扑规划、表结构检查、迁移配置、执行监控及迁移后优化等关键步骤,为大数据量场景下的ClickHouse扩容提供完整解决方案。

weixin_29091837的博客 292

《都挺好》:你对硅谷程序员是不是有什么误解?

最近一部《都挺好》新剧看得让人揪心,它源于生活,又高于生活,就连剧名听着都格外讽刺,哪里“都挺好”,明明“都不好”。 清华 CS 本科,斯坦福 CS 博士,近 10 年硅谷科技公司工作经验,勤奋努力,踏实肯干。 就是这样一位学历顶天、智商爆表、任劳任怨的“超高配置”程序员,在硅谷的年薪却不到 10 万.....背负着房贷的压力不说,甚至因没陪领导开心而被裁了员! 更不可思议的是,失业之后...

Python_1_3的博客 1571

【智慧城市】GIS数据获取-获取道路/水路数据

【GIS数据获取】获取道路/水路数据

qq_16599281的博客 4749

使用TinyProxy搭建代理服务器

背景 办公电脑所在网络无法连接外网,机房服务器可以连接外网,通过服务器代理上网; 一、CentOS下TinyProxy安装–搭建代理服务器 TinyProxy是个轻量级简单的HTTP/HTTPS代理程序,GitHub和官网,安装方式这里主要介绍两种 CentOS下yum安装,参考:TinyProxy安装 Docker安装 先安装docker环境yum install docker -y 二、Win10下使用 ...

椰汁菠萝 1万+

带你了解一下网络爬虫的边界和复杂性

通用网络爬虫”的定义更加模糊,有时候大家讲“通用网络爬虫”,实际上他心里想的是 搜索引擎,甚至是 ChatGPT 这样的东西:反正我给你一个链接,你就得把我想要的数据给我。这样看,网络爬虫的未来是 AutoGPT,或者叫数字超人,或者硅谷最新的叫法,叫 AI agents。一般来说,把一个网站一个栏目的网页下载下来,按一定规则把网页中的数据提取出来就是完整的网络爬虫定义。在这里给大家分享一些免费的课程供大家学习,下面是课程里面的截图,扫描最下方的二维码就能全部领取,5.大批量站点的信息抽取(难难难)

Everly_的博客 866

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1730

Python爬虫的解析(学习于b站尚硅谷)

本文是本人在b站上学习尚硅谷的Python爬虫教程小白零基础速通的,关于爬虫部分后记录的笔记。

无 3549

Codex 100个真实案例 - 用AI做在线考试系统(自动组卷+防作弊)

本案例使用 Codex 从零搭建一个功能完整的在线考试系统。涵盖题库管理(单选/多选/判断/填空)、智能随机组卷、考试倒计时、自动判分、成绩统计分析、以及多维度防作弊机制(切屏检测、禁止复制粘贴、IP限制等)。前端使用 Vue 3 + Element Plus 构建考试界面,后端使用 Node.js + Express + MySQL 提供 API 服务。全程用自然语言驱动 Codex 完成开发,最终交付一个可直接部署的在线考试平台。

yueyeguzhuo的专栏 77

零基础教你学RDMA驱动开发--第8篇:队列对(QP)、完成队列(CQ)与工作请求(WR)机制剖析

本文深入剖析了RDMA(远程直接内存访问)中的核心机制:队列对(QP)、完成队列(CQ)和工作请求(WR)。QP作为通信端点包含发送队列(SQ)和接收队列(RQ);WR是用户提交的操作指令,转换为工作队列元素(WQE)后由网卡异步执行;CQ则提供完成通知机制。文章详细介绍了三者的协作原理,包括QP状态机、WR提交方式、CQ轮询机制,以及关键的信号控制技术(Signaled Mode)来优化性能。同时对比了SEND/RECV和RDMA WRITE两种模式的差异,提供了调试技巧和最佳实践。这些机制共同构成了RD

amy_mhd的博客 156

Python爬虫基础总结笔记

Python爬虫基础笔记

Infinity_and_beyond的博客 2882

【毕业设计】基于雷达与深度学习的摔倒检测——雷达数据集处理

雷达原始数据是时域非平稳信号,快速傅里叶变换(Fast Fourier Transformation, FFT)不能很好地提取微多普勒效应的模式特征。因此短时傅里叶变换(Short Time Fourier Transformation, STFT)被应用于雷达信号的时频谱分析。本文主要介绍雷达数据集的预处理过程,包括时频谱图的中值滤波与 SVD 分解。

洋洋Young的博客 1808

Python爬虫的scrapy的学习(学习于b站尚硅谷)

本文是本人在b站上学习尚硅谷的Python爬虫教程小白零基础速通的,关于爬虫部分后记录的笔记。

无 5579

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Python爬虫的requests(学习于b站尚硅谷)

本文是本人在b站上学习尚硅谷的Python爬虫教程小白零基础速通的,关于爬虫部分后记录的笔记。

无 2425

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python爬虫学习笔记(基于尚硅谷)

本人入门python爬虫的学习笔记,记录了我学习过程中遇到的问题和解决方法,希望能帮助到想要吃下这个技术的同学

weixin_59499097的博客 2513

从小白到高手 | 尚硅谷Python爬虫视频教程发布!

有小伙伴和我哭诉:上次薅羊毛,未遂。 这都不是事儿! 喜迎开学季,尚大发福利, “你来学技术,我送大会员”活动继续, 接着奏乐,接着舞: 传送门:https://t.bilibili.com/564930796638779555 离人心头一叶秋,别后恨悠悠。 倦容初醒,倚栏观水,西风难休。 春来碧水盼君归,暖炉煨酒。 夜半寒影,孤衾若冰,何处遣愁。 ——小红 《九月一日忆东北著名狠人晶哥》 今天,给大家隆重介绍一位新朋友, 江湖人送外号:红浪漫晶哥。 因讲课善用红浪漫举例而

m0_58371965的博客 671

Python爬虫的Selenium(学习于b站尚硅谷)

本文是本人在b站上学习尚硅谷的Python爬虫教程小白零基础速通的,关于爬虫部分后记录的笔记。

无 3075

尚硅谷Python爬虫教程小白零基础速通

注:笔记已跳过Python基础知识部分。

纯鹿人的博客 414

python webkit爬虫_基于WebKit的网络爬虫

摘 要: 以AJAX技术为代表的Web应用新技术的出现,赋予了JavaScript更加丰富的功能。但也导致更多的URL>> 基于陷阱技术的网络爬虫检测 基于网络爬虫原理的Web内容挖掘技术分析 基于网络爬虫的XSS漏洞挖掘技术 一种基于python语言的网络爬虫研究 基于Scrapy框架的分布式网络爬虫实现 基于多线程的网络爬虫设计与实现 基于网络爬虫的设计与实现 基于Websphin...

weixin_30647423的博客 765

一篇最全Python 爬虫超详细讲解(零基础入门,适合小白)

爬虫(Web Scraping)就是用程序自动从网站上抓取数据的工具,比如下载图片、收集新闻、分析价格等。这个教程基于 2026 年最新实践(Python 3.12+),结合了网络上热门资源(如 Bilibili 尚硅谷教程、知乎文章等)。准备好你的电脑,我们开始吧!不要爬取受保护的数据(如个人信息),尊重 robots.txt 协议,避免高频请求导致网站崩溃。:改成爬取豆瓣电影 Top 250 的电影名(URL: https://yingjuxia.com/archives/8406)。

likuoelie的博客 8608

Python爬虫——Urllib库-1

Python爬虫入门,urillb以及UA反扒的破解

WenJGo的博客 2万+

尚硅谷python爬虫Scrapy基础

b站尚硅谷爬虫学习scrapy

i_kun_的博客 1248

尚硅谷python爬虫(五)-scrapy

一、scrapy简介 scray是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理 或存储历史数据等一系列的程序中 二、scrapy项目的创建及运行 1.创建scrapy项目 终端输入 scrapy startproject 项目名称 2.项目组成 spiders __init__.py 自定义的爬虫文件.py ‐‐‐》由我们自己创建,是实现爬虫核心功能的文件 __init__.py items.py ‐‐‐》定义数据结构的地方,是一个继承自scrap

qq_41477300的博客 1615

《尚硅谷Python爬虫教程小白零基础速通》P72代码纠正

浏览器页面显示的html内容,和python中实际获取的html的内容可能存在差异,最好打印出来对比一下浏览器中通过xpath拼接的query语句,在代码中用可能查不到,建议打印出实际获取的content内容,然后从content里找所需的内容标签,然后自己拼接xpath的语句,这样无论前端如何变,你都可以实现功能实在不会自己拼xpath语句,可以把对应图片数组的一小段html的内容复制出来,问下AI,让AI帮你拼,比如:文心一言、通义千问、当然有ChatGPT更好。

pengxu888的博客 669

【零基础学Python】爬虫篇 :第十七节-爬虫bs4解析从入门到入坑|实战总结

越来越发现学爬虫就像找女朋友一样,慢慢来,找到合适的机会才能拿下!让我们来先把爬虫拿下吧!

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 9796
上一篇: 如何利用Python每天给自己赚一包烟钱?
下一篇: Python黑客系列之——控制自己的手机摄像头拍照,并自动发送到邮箱。
PythonJavaPHP
博客等级 码龄7年 116粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值