1楼(站大爷用户) 这两天刚好总结了自己学爬虫的一些基础知识,有错误的地方还希望大家指正。
另放一个学习过程中自己做的爬虫,简单爬一些微博、知乎、豆瓣的数据。GitHub - Qutan/Spider: 社交数据爬虫
------------------------------------------------------------------------------------------------------
爬虫学习笔记
学习资料:requests官方文档;bs4官方文档;“极客学院”定向爬虫教程
目录
爬虫学习笔记
Requests基础
发送请求
响应内容
Session
如何反爬虫
正则表达式
常用符号
常用方法
XPATH
BeautifulSoup
创建对象
Tag
其他对象
遍历文件树
搜索文件树
find_all( name , attrs , recursive , text , **kwargs )
其他方法
Requests基础发送请求
所有requests请求均返回response对象
requests.get(url) 通过get方式发送请求
参数可以通过url+?+key=value&…方式添加
也可以dict={key:value},requests.get(url,params=dict)方式添加
requests.post(url) 通过post方式发送请求
参数可以通过dict={key:value}, requests.post(url,data=dict)方式添加
如果不以表单形式提交,request.post(url,data=json.dumps(dict))
requests.get(url, headers = headers) 定制请求头
headers的内容可以审查里查看request header里内容
requests.get(url,cookies = cookies) 发送cookies到服务器
cookies = dict(Cookies=’working’) key和value都从request hearder里查看(用于免登陆)
response.cookies可以获得可用于登陆的cookie,但是只能从post方法的requests得到cookies
requests.utils.dict_from_cookiejar(cookies) 将cookie转换为dict
requests.get(url, proxies=proxies) 使用代理
requests.get(url, timeout=n) n秒后停止等待响应
响应内容
r= requests.get(url)
r.url 传递的地址
r.text 文本格式内容
r.json json格式内容
r.content 字节格式内容(常用)
r.status_code 响应状态码
正常 200 requests.code.ok
r.headers 服务器响应头
Session
Session保持用户的登录信息
s=requests.Session() 新建Session
s.headers.update({‘x-test’: ‘true’}) 之后的不用在参数里加上headers
s.post(url,data)得到cookie后,再s.get(url)可以不通过cookie就可以访问页面
如何反爬虫
cookies池,更换cookie意味着更换用户
proxies池,更换proxy意味着更换IP
header中伪装浏览器,加入User-Agent及Referer
设置延迟,time.sleep(1)
正则表达式常用符号
.:匹配任意字符,换行符\n除外, 类似一个占位符
*:匹配前一个字符0次或无限次
?:匹配前一个字符0次或1次
+:匹配前一个字符1词或无限次
.*:贪心算法,能找到多少是多少
.*?:非贪心算法
\d:匹配数字
[abc]:abc任意一个
{m,n}:匹配前一个字符m到n次
| :匹配|左右任意一个
(.*?) :输出符合条件的,将()里结果返回
常用方法
findall:匹配所有符合规律的内容,返回包含结果的列表;
第一个参数是pattern,第二个是查找范围
re.S作为findall的第三个参数,让 . 匹配\n
以列表返回将所有的结果
content = re.findall(r'
(.*?)', html, re.S)
2楼(未知网友) 从爬虫必要的几个基本需求来讲: 1.抓取 py的urllib不一定去用,但是要学,如果你还没用过的话。 比较好的替代品有requests等第三方更人性化、成熟的库,如果pyer不了解各种库,那就白学了。 抓取最基本就是拉网页回来。 如果深入做下去,你会发现要面对不同的网页要求,比如有认证的,不同文件格式、编码处理,各种奇怪的url合规化处理、重复抓取问题、cookies跟随问题、多线程多进程抓取、多节点抓取、抓取调度、资源压缩等一系列问题。 所以第一步就是拉网页回来,慢慢你会发现各种问题待你优化。 2.存储 抓回来一般会用一定策略存下来,而不是直接分析,个人觉得更好的架构应该是把分析和抓取分离,更加松散,每个环节出了问题能够隔离另外一个环节可能出现的问题,好排查也好更新发布。 那么存文件系统、SQLorNOSQL数据库、内存数据库,如何去存就是这个环节的重点。 你可以选择存文件系统开始,然后以一定规则命名。 3.分析 对网页进行文本分析,提取链接也好,提取正文也好,总之看你的需求,但是一定要做的就是分析链接了。 可以用你认为最快最优的办法,比如正则表达式。 然后将分析后的结果应用与其他环节:) 4.展示 要是你做了一堆事情,一点展示输出都没有,如何展现价值? 所以找到好的展示组件,去show出肌肉也是关键。 如果你为了做个站去写爬虫,抑或你要分析某个东西的数据,都不要忘了这个环节,更好地把结果展示出来给别人感受。
3楼(未知网友) 刚做完一个跟python爬虫相关的项目,跑来回答一下这个问题。作为一个曾经从此问题获益的人,也来说说自己的经验,希望对想学习python爬虫的人有所帮助。 题主既然问的是如何入门,我想一定是助学者,而且我觉得想学python的有很大一部分不是计算机相关专业的(比如我)。记得我当初想入门学python,学爬虫,最困惑的就是一大堆名词听都没听说过。我觉得对初学者而言,不应该一上来就提分布式,多线程,因为这些名词对于一个未入门的人来说很有可能是陌生的,而这些东西在初期学爬虫的时候是不需要用到的,只有当项目上了一定规模,需要提升性能的时候才会用到。而且我建议初学者不要去学什么框架。很多人建议去学scrapy,初学就去接触这些框架很容易学的云里雾里。就好比很多人一上来就建议刚接触web开发的人去学ruby on rails,rails虽好,但rails太“智能”了,它帮你做了太多的事情,以至于你甚至会觉得我都没怎么做,这东西是怎么出来的。这样就会学的很困惑。框架是给有基础的人提升开发速度用的,初学者还是老老实实从基础学起。 爬虫不外乎是为了获取网络上的信息,要取得信息,你就得给给服务器发请求,然后服务器把信息发给你,这一步一般较为简单。服务器发给你的一般是一个html文件,拿到文件后,你可能会觉得这是什么乱七八糟的东西,怎么都看不懂。我觉得对于一个非计算机系的人来说,想要做点东西出来,最大的困难是缺的知识太多了,html看不懂,http原理也不懂。所以这时候你会发现你需要去学一点html,去w3cschool看一看教程,你并不需要懂很多,弄懂各种标签的含义,能看懂html文件里的内容就行。 拿到html文件,接下来你要做的就是提取信息,准确地说,是你感兴趣的信息。你需要两样东西,一样用来快速定位你要获取的信息在html源文件中的位置,让你知道要提取什么;另一样用来提取信息。第一样可以选firefox或chrome,都自带开发者功能,第二样可以用Beautiful Soup。所以你需要花一点时间了解开发者功能怎么用,以及Beautiful Soup这个库的用法。会发请求,会提取信息,这些就够了,赶紧做点东西,找点成就感,这样才能有动力继续做下去。比如可以做下载某些网站的图片,把知乎上的答案抓到本地。有点成就感之后就有动力更深入学习了。 在做的过程中,你可能会遇到一些困难,比如你拿到的html跟浏览器看到的html不一样,你上网找一找就会发现,你需要了解一个叫http请求头的东西。找一点资料看看,知道http请求头是怎么回事就行了,不需要完全弄懂http的原理,解决当下的问题才是最重要的,有什么不懂的稍后再补。学了点东西后,你就知道这怎么解决这个问题了,只需在发请求的时候加一个参数,带上http请求头即可,这叫做模拟浏览器的行为。把这个问题解决后,抓取大多数网站都没有问题了。成就感又提升了一点。 有时候你又会发现,有一些网站需要登录才能取得一些信息。找一找资料,你就会接触到“模拟登录”,“post请求”等名词。这时候,你又需要去学习一些http的知识,了解“get”,“post”是怎么回事,以及如何发post请求。为了方便处理http的相关东西,你最好学习一下requests这个库。学习之后,参照网上的代码,我相信模拟登录的问题也解决了。比如,你就可以模拟登录知乎,然后抓取知乎的首页看看,是不是跟你用浏览器中看到的一样? 继续深入,你就会发现这些也不够了,有些信息我需要点一下“更多”按钮才会加载,如何获取这些信息呢?这时候你就需要分析在点“更多”按钮的时候浏览器做了什么,然后去模拟浏览器的行为。如何分析呢?我一般用firebug,看看点击更多按钮的时候,浏览器做了什么,浏览器一般会发一个post请求,会带上一些参数,你需要知道的就是要带上哪些参数,发请求给谁。这一步可能会有点困难,可以慢慢体会怎么做。一旦越过了这这道坎,你就几乎可以取得任何你想要的信息了。 假设你已经成功了,得到了服务器传回来的数据,你可能会发现,这又跟html不一样了。这是一个叫json的东西,传回来的数据都在里面了,接下来就是要提取数据了。所以你又要去了解json是什么,如何用python处理json。 好了,基本上做完这些,爬虫就算入了门。接下来为了提高性能,扩大规模,再去搞多线程,分布式什么的吧,这也是我接下来需要努力和学习的方向。 那么,学了这些后,我做了点什么? zhihu-python:egrcc/zhihu-python · GitHub,一个获取知乎上各种信息的工具,你可以获取任何你想要的问题,答案,用户,收藏夹信息,并且可以方便地将答案备份导出为 txt 或 markdown 文件。获取某个问题下的全部回答,或者备份某大V的全部回答都变得很简单。当然,功能不只有这些,详情请见项目地址:egrcc/zhihu-python · GitHub。在这个项目中遇到的跟爬虫相关的所有问题几乎都在上面了,当然也遇到了一些其他的问题,都通过网上的资料和他人的帮助解决了。这个项目不到一千行,虽然不是很大,跟一些大牛的项目没法比,代码写的可能也不是很好,请大家多多指教,也可以帮助完善和改进该项目。 以上就是我作为一个初学者的学习经历。题主提这个问题也有一段时间了,可能都已经学会了吧,我就全当做学完后的总结吧。希望对今后想学习的人有所帮助。 最后说一些感想: 1. 不要急于求成,编程虽然不难,但也没有那么简单,不要想着速成,特别是对于计算机基础不是很好的人。 2. 学习的过程中可能会遇到很多困难(上面可能没有提到),或许会有很多你没有接触的东西冒出来,善用google,一个个问题地解决,缺什么补什么。 3. 对于初学者来讲,最重要的不是去学各种吊炸天的框架,追最新的技术。技术,框架是学不完的,永远都会层出不穷,最重要的是把基础学好。很多时候你有一个问题解决不了,都是你某些方面的知识缺了。慢慢来,不要急,随着学习的深入,再回过头来看以前的问题,会有豁然开朗的感觉。 4. 一定要动手做,找点成就感,对你继续做下去有很大的促进作用。不然的话,遇到点困难很容易就放弃了。
4楼(未知网友) 看了大部分回答不禁叹口气,主要是因为看到很多大牛在回答像“如何入门爬虫”这种问题的时候,一如当年学霸讲解题目,跳步无数,然后留下一句“不就是这样推嘛”,让一众小白菜鸟一脸懵逼。。作为一个0起步(之前连python都不会),目前总算掌握基础,开始向上进阶的菜鸟,深知其中的不易,所以我会在这个回答里,尽可能全面、细节地分享给大家从0学习爬虫的各种步骤,如果对你有帮助,请点赞~ ------------------------------------------------------------------------------------------------- #我要写爬虫! #Ver.1.2 #Based on: Python 2.7 #Author:高野良 #原创内容,转载请注明出处 首先!你要对爬虫有个明确的认识,这里引用毛主席的思想: 在战略上藐视: “所有网站皆可爬”:互联网的内容都是人写出来的,而且都是偷懒写出来的(不会第一页是a,下一页是8),所以肯定有规律,这就给人有了爬取的可能,可以说,天下没有不能爬的网站 “框架不变”:网站不同,但是原理都类似,大部分爬虫都是从 发送请求——获得页面——解析页面——下载内容——储存内容 这样的流程来进行,只是用的工具不同 在战术上重视: 持之以恒,戒骄戒躁:对于初学入门,不可轻易自满,以为爬了一点内容就什么都会爬了,爬虫虽然是比较简单的技术,但是往深学也是没有止境的(比如搜索引擎等)!只有不断尝试,刻苦钻研才是王道!(为何有种小学作文即视感) || || V 然后,你需要一个宏伟的目标,来让你有持续学习的动力(没有实操项目,真的很难有动力) 我要爬整个豆瓣!... 我要爬整个草榴社区! 我要爬知乎各种妹子的联系方式*&^#%^$# || || V 接着,你需要扪心自问一下,自己的python基本功吼不吼啊? 吼啊!——OK,开始欢快地学习爬虫吧 ! 不吼?你还需要学习一个!赶紧回去看廖雪峰老师的教程, 2.7的。至少这些功能和语法你要有基本的掌握 : list,dict:用来序列化你爬的东西 切片:用来对爬取的内容进行分割,生成 条件判断(if等):用来解决爬虫过程中哪些要哪些不要的问题 循环和迭代(for while ):用来循环,重复爬虫动作 文件读写操作:用来读取参数、保存爬下来的内容等 || || V 然后,你需要补充一下下面几个内容,作为你的知识储备: (注:这里并非要求“掌握”,下面讲的两点,只需要先了解,然后通过具体项目来不断实践,直到熟练掌握) 1、网页的基本知识: 基本的HTML语言知识(知道href等大学计算机一级内容即可) 理解网站的发包和收包的概念(POST GET) 稍微一点点的js知识,用于理解动态网页(当然如果本身就懂当然更好啦) 2、一些分析语言,为接下来解析网页内容做准备 NO.1 正则表达式:扛把子技术,总得会最基础的: NO.2 XPATH:高效的分析语言,表达清晰简单,掌握了以后基本可以不用正则 参考:XPath 教程 NO.3 Beautifulsoup: 美丽汤模块解析网页神器,一款神器,如果不用一些爬虫框架(如后文讲到的scrapy),配合request,urllib等模块(后面会详细讲),可以编写各种小巧精干的爬虫脚本 官网文档:Beautiful Soup 4.2.0 文档 参考案例: || || V 接着,你需要一些高效的工具来辅助 (同样,这里先了解,到具体的项目的时候,再熟悉运用) NO.1 F12 开发者工具: 看源代码:快速定位元素 分析xpath:1、此处建议谷歌系浏览器,可以在源码界面直接右键看 NO.2 抓包工具: 推荐httpfox,火狐浏览器下的插件,比谷歌火狐系自带的F12工具都要好,可以方便查看网站收包发包的信息 NO.3 XPATH CHECKER (火狐插件): 非常不错的xpath测试工具,但是有几个坑,都是个人踩过的,,在此告诫大家: 1、xpath checker生成的是绝对路径,遇到一些动态生成的图标(常见的有列表翻页按钮等),飘忽不定的绝对路径很有可能造成错误,所以这里建议在真正分析的时候,只是作为参考 2、记得把如下图xpath框里的“x:”去掉,貌似这个是早期版本xpath的语法,目前已经和一些模块不兼容(比如scrapy),还是删去避免报错 NO.4 正则表达测试工具: 在线正则表达式测试 ,拿来多练练手,也辅助分析!里面有很多现成的正则表达式可以用,也可以进行参考! || || V ok!这些你都基本有一些了解了,现在开始进入抓取时间,上各种模块吧!python的火,很大原因就是各种好用的模块,这些模块是居家旅行爬网站常备的—— urllib urllib2 requests || || V 不想重复造轮子,有没有现成的框架? 华丽丽的scrapy(这块我会重点讲,我的最爱) || || V 遇到动态页面怎么办? selenium(会了这个配合scrapy无往不利,是居家旅行爬网站又一神器,下一版更新的时候会着重安利,因为这块貌似目前网上的教程还很少) || || V 爬来的东西怎么用? pandas(基于numpy的数据分析模块,相信我,如果你不是专门搞TB级数据的,这个就够了) || || V 然后是数据库,这里我认为开始并不需要非常深入,在需要的时候再学习即可 mysql mongodb sqllite 遇到反爬虫策略验证码之类咋整? PIL opencv pybrain || || V 进阶技术 多线程、分布式 V1.2更新日志: 修改了一些细节和内容顺序
5楼(站大爷用户) ——————最重要的话写在前面—————— 0、新手/喜欢练习/欢迎交流/邀请/我是看着这个问题下面的答案学习的 1、带着一个目的来学爬虫。#我的目的实现了…所以我来写这个回答了。 2、不要怂就是干!系统学习固然好,直接写一个项目出来效果更加简单粗暴!(不过自己现在的水平写出来都是流水一般的面向过程的代码,代码的重复部分太多,正在回过头去学习面向对象编程,学习类和方法的使用。不过我还是坚定地认为入门的时候应该直接简单粗暴地实践一个项目) 3、哪里不会搜哪里!哪里报错改哪里!相信我你遇到的99%的问题都能从网上找到相似的问题,你需要做的就是写代码!搜问题!调BUG!你搜不到解决办法的情况下,80%的情况是你搜索的姿势不对,另外20%可能需要你自己动动脑子,换个思路去做。 举个印象最深的例子。 我在统计知乎回答voters的具体情况的时候(后面会介绍)发现知乎的数据是这样发送的。 http://www.zhihu.com/answer/15219795/voters_profile?total=70&offset=10&follows=wAp13IyyllRUgyux1Zp3MSGySe4GNnw-AG6-yDt_MO68ywzyjX_TGN3o 什么鬼(摔)。 等到我辛辛苦苦用正则把里面的信息提出来的时候发现我得到的数据是这样的… 我的内心是崩溃的…… 问题很明显是编码问题……用户那一列全部是unicode编码……转成中文就好了嘛…… 我刚开始也是这么想的…当我尝试了各种encode和decode…以后整个人都不好了。 大概是这样的。我用Shell演示一下…应该能看懂。 但是我的字符串是自动获取的啊,怎么可能挨着用 u' '赋值…… 于是我开始了漫长的搜索之路……在看了无数篇重复度高于百分之80的关于编码的文章后,在我都快要放弃的时候…看到了这个…水木社区-源于清华的高知社群 你能理解我当时内心的酸爽吗… 大概就是这样。 所以我遇到的问题已经很奇葩了依然还是有解决办法的嘛。Windows下面编码各种混乱,系统编码,编程时编辑器的编码,抓取网页以后网页的编码,Python2的编码,Python3的编码……新人真的很容易搞昏头。 例子不多言了。后面还有很多。 ——————正文1:我的爬虫入门,不谈学习,只聊项目(代码已贴)—————— 前面说到学爬虫需要一个目标。那我的目标是什么呢?听我慢慢讲。 前些日子我回答了一个问题高考后暑假应该做什么事? - 生活 我回答这个问题的时候呢关注人数也就才刚刚过百,我的赞数也涨的很慢… 可是突然有一天呢,我发现突然就出现了一个300赞的回答…当时那个问题的关注似乎还不到300。我百思不得其解…但是我看了看那个回答的赞同和答主的主页。 大概是这样的: 然后我隐隐觉得…可能会是刷赞?当然我们不能恶意地去揣测别人,要拿数据说话,毕竟知乎现在的三零真实用户还是蛮多的,不一定都是水军的小号。 于是我一个从来没有学过爬虫的人就开始学爬虫了…然而并不一帆风顺。首先是知乎显示“等人赞同”的方式做了修改,参见如何评价知乎新的「某某等人赞同」显示方式? - 如何评价 X。 其次我刚开始的时候不会维持登陆…每次抓到的数据里都有很多的“知乎用户”(也就是未登录状态下抓取不成功)。 为了行文的连贯我跳过中间学习时做的几个小爬虫…直接放我做成功的结果吧。 选取的样本回答依次为: @段晓晨高考后暑假应该做什么事? - 段晓晨的回答 @EdgeRunner高考后暑假应该做什么事? - EdgeRunner 的回答 @孔鲤高考后暑假应该做什么事? - 孔鲤的回答 @Emily L能利用爬虫技术做到哪些很酷很有趣很有用的事情? - Emily L 的回答 @chenqin为什么 2015 年初,上海有卫计委官员呼吁大家生二胎? - chenqin 的回答 感兴趣的可以下载数据 getvoters.xls_免费高速下载 getvoters2.xls_免费高速下载 getvoters3.xls_免费高速下载 getvoters4.xls_免费高速下载 getvoters5.xls_免费高速下载 结论就是……没有结论。 话说我回答的那个三零用户比例也好高啊……我真的没有刷赞我保证!(话说我的赞里面要是有水军的话我会很伤心的……我一直以为是我写的好他们才赞我的QAQ) 到这里第一个项目就结束了… 这个我暂时不贴代码…代码不完善…还得有点小修改。两天内放上来。 ——来贴代码—— loveQt/Zhihu_voters · GitHub 使用前请填写config.ini文件,cookie不用填。 依然不完善。是这样的,知乎在获取“等人赞同”的时候有一个很畸形的地方在于……答案的id很畸形。 比如我现在这个答案。 http://www.zhihu.com/question/20899988/answer/49749466 当我点击“等人赞同”的时候。抓包得到请求地址。我用的是Firefox的Firebug 这个地址是这样的: http://www.zhihu.com/answer/15299264/voters_profile 如果你继续往下拉,知乎会自动加载更多用户,你会得到形如这样的地址: http://www.zhihu.com/answer/15299264/voters_profile?total=143&offset=10&follows=YCPQ47_p62oaS49riUMu-4sTvAQfYpoe5E2RRX9lj40vWR6E4J5W_T-U 分析这个地址的构成就会发现 /answer/这里应该是这个回答的唯一id,而这个id显然与上面的/question/20899988/answer/49749466是不一样的,我抓了好多个回答,结论应该是没有规律的,知乎应该是给每个问题一个id,每个问题下面的回答一个id,但是只有点赞的时候这个回答才会得到它关于voters的id…… 所以我没办法实现完全的自动化…你如果想爬指定的回答,似乎得先手动抓包了 QAQ 抓包的示意如上,打开网络面板,点击“等人赞同”,找到地址中的数字就可以了。 如果你会抓包了请接着看下去。 代码的下载地址在上面的github。Python版本为2.7,希望你们会用pip安装依赖的库。 简单说几个方面。 1、知乎的登陆。我模仿了 @egrcc 和 @7sDream 的项目,使用了requests.session。 def login(): cf = ConfigParser.ConfigParser() cf.read("config.ini") cookies = cf._sections['cookies'] email = cf.get("info", "email") password = cf.get("info", "password") cookies = dict(cookies) global s s = requests.session() login_data = {"email": email, "password": password} header = { 'User-Agent': "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0", 'Host': "www.zhihu.com", 'Referer': "http://www.zhihu.com/", 'X-Requested-With': "XMLHttpRequest" } r = s.post(Login_url, data=login_data, headers=header)
6楼(未知网友)
7楼(未知网友) 个人觉得: 新手学习python爬取网页先用下面4个库就够了:(第4个是实在搞不定用的,当然某些特殊情况它也可能搞不定) 1. 打开网页,下载文件:urllib 2. 解析网页:BeautifulSoup,熟悉JQuery的可以用Pyquery (感谢 @李林蔚 的建议) 3. 使用Requests来提交各种类型的请求,支持重定向,cookies等。 4. 使用Selenium,模拟浏览器提交类似用户的操作,处理js动态产生的网页 这几个库有它们各自的功能。配合起来就可以完成爬取各种网页并分析的功能。具体的用法可以查他们的官网手册(上面有链接)。 做事情是要有驱动的,如果你没什么特别想抓取的,新手学习可以从这个爬虫闯关网站开始 ,目前更新到第五关,闯过前四关,你应该就掌握了这些库的基本操作。 实在闯不过去,再到这里看题解吧,第四关会用到并行编程。(串行编程完成第四关会很费时间哦),第四,五关只出了题,还没发布题解。。。 学完这些基础,再去学习scrapy这个强大的爬虫框架会更顺些。这里有它的中文介绍。 感谢大家支持,改了改链接的格式,好看多了,呵呵
8楼(未知网友) “入门”是良好的动机,但是可能作用缓慢。如果你手里或者脑子里有一个项目,那么实践起来你会被目标驱动,而不会像学习模块一样慢慢学习。 另外如果说知识体系里的每一个知识点是图里的点,依赖关系是边的话,那么这个图一定不是一个有向无环图。因为学习A的经验可以帮助你学习B。因此,你不需要学习怎么样“入门”,因为这样的“入门”点根本不存在!你需要学习的是怎么样做一个比较大的东西,在这个过程中,你会很快地学会需要学会的东西的。当然,你可以争论说需要先懂python,不然怎么学会python做爬虫呢?但是事实上,你完全可以在做这个爬虫的过程中学习python :D 看到前面很多答案都讲的“术”——用什么软件怎么爬,那我就讲讲“道”和“术”吧——爬虫怎么工作以及怎么在python实现。 先长话短说summarize一下: 你需要学习 基本的爬虫工作原理 基本的http抓取工具,scrapy Bloom Filter: Bloom Filters by Example 如果需要大规模网页抓取,你需要学习分布式爬虫的概念。其实没那么玄乎,你只要学会怎样维护一个所有集群机器能够有效分享的分布式队列就好。最简单的实现是python-rq: https://github.com/nvie/rq rq和Scrapy的结合:darkrho/scrapy-redis · GitHub 后续处理,网页析取(grangier/python-goose · GitHub),存储(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
9楼(未知网友) 以下是我学python爬虫的打怪升级之路,过程充满艰辛,也充满欢乐,虽然还未打倒大boss,但一路的风景就是最大的乐趣,不是么?希望大家能get到想要的东西!
多图预警!
以下奉献一段爬取知乎头像的代码
import requests
import urllib
import re
import random
from time import sleep
def main():
url='https://www.zhihu.com/question/22591304/followers'
#感觉这个话题下面美女多
headers={省略}
i=1
for x in xrange(20,3600,20):
data={'start':'0',
'offset':str(x),
'_xsrf':'a128464ef225a69348cef94c38f4e428'}
#知乎用offset控制加载的个数,每次响应加载20
content=requests.post(url,headers=headers,data=data,timeout=10).text
#用post提交form data
imgs=re.findall('
#在爬下来的json上用正则提取图片地址,去掉_m为大图
for img in imgs:
try:
img=img.replace('\\','')
#去掉\字符这个干扰成分
pic=img+'.jpg'
path='d:\\bs4\\zhihu\\jpg\\'+str(i)+'.jpg'
#声明存储地址及图片名称
urllib.urlretrieve(pic,path)
#下载图片
print u'下载了第'+str(i)+u'张图片'
i+=1
sleep(random.uniform(0.5,1))
#睡眠函数用于防止爬取过快被封IP
except:
print u'抓漏1张'
pass
sleep(random.uniform(0.5,1))
if __name__=='__main__':
main()
结果:
最后,请关注我吧,我会好好维护你的时间线的:)
立即注册站大爷用户,免费试用全部产品
立即注册站大爷用户,免费试用全部产品