前导:做网络爬虫(Web crawler)是方便大量收集、跟踪数据的相当便捷的方法。笔者在过去一年内,做过上市项目信息收集,WHO官网致病数数据收集,京东商品信息收集,以及Bilibili视频信息收集,微信公众号历史文章抓包,各大媒体网站数据抓包,并尝试在服务器搭载爬虫。之前的项目中,全靠自己摸索如何掌握爬虫所需要的前置知识,并不断找到更快的爬虫方案,现汇成一个新手指引分享给大家,希望对想自学/提高生产力的同学们有帮助。如果有不妥当的地方,欢迎大家在评论区指正~
全文7538字,可以先存着,学习过程中慢慢看。本文欢迎转载,转载请标明原文出处。
所需自学的爬虫语言(按顺序):
所需自学的外置库
所需自学数据储存流程:
为了写爬虫,所学这些语言的目的如下:
笔者目前只接触了C++和Python两个基础语言,Python相对来说容易上手,对运行时间和内存分配没有编程要求,而且安装的库也丰富而且容易上手,所以之前的案例我都是用Python完成的,基本学完了函数就能解决爬虫问题。此外,Java也支持很多外置库,而且跟前后端语言结合度更好,也很推荐使用。
HTML是爬虫的入门语言,想要爬取网页上的数据,就得能读得懂网页代码内容,一般都是ctrl+shift+C (windows)或者command+shift+C(Mac)来查看网页源代码,然后找到所要爬取的元素的路径。这个路径下的元素就可以被bs4库解析后找出来,元素内的文字部分或本身者链接部分就可以被转换为字符串了,可以保存在本地。
也有不少网页的数据储存在不同结构里,比如表格、下拉条、选项框内,因此就要懂得找不同的元素,通过学习HTML即可。对于动态元素,比如下拉刷新页面了之后才能呈现的,这我就放到Selenium部分讲解。对于"Get"服务器直接就能返回的HTML代码,requests库就能爬取下来。
会了HTML就已经成功一大半了,找元素自然可以根据元素种类和名称来找。但有些元素的html路径并不是固定的,而可能随着页面尺寸改变而改变,这就需要CSS/Xpath来找元素。
在下面这个图里面,copy的路径可以是html(外部html和内部html), Xpath(相对路径),以及selector path(通过css筛选器选取元素)。学习HTML可以方便你了解元素作为文本,是如何存的。 学习CSS可以方便你了解元素的呈现格式(位置,大小,颜色)是怎么样的,从而能更准确的找到元素。CSS会让你的代码更灵活。
js就和事件触发有关了,比如按按钮/按回车/输内容后网页的反馈,这种事件触发受js控制,比如bilibili上搜索页的翻页特效由js代码控制,这代码是相当长的,并且是存放在github上,由b站服务器随取随用。不少网站是在触发了按钮等事件后,元素才能被加载出来。学习js能方便你对事件(event)的了解,这在Selenium爬虫出就很有用了。
JQuery实际上是升级版的JS,支持更多的HTML操作功能,和前端与服务端的交互功能;类似的还有Angular,Vue.js,React.js。可以作为js的补充
php就是真正的服务端了,用于处理html/js等前端程序发来的操作请求,调用数据库等服务器功能,再把调用的数据反回给前端。笔者现在正在做服务器交互,发现PHP中的curl作为爬虫工具,与服务器交互的效率大过本地的requests库与服务器交互效率。而且对要调用API的爬虫来说更方便编码和更新管理。
知道了网页组成和服务器如何与用户交互,接下来就是学习如何通过链接打开网站、并返回第一时间所加载出的HTML代码给程序的Requests(re)库。访问方法很简单(我觉得get请求会稍微快过post,不过要向服务器传输数据则要用post):
searchPage = requests.get(
url = 'https://www.......',
headers = {
"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 "},
proxies = {
'http' : 'http://123.123.123:1234'},
timeout = 60)
url就是你要爬取内容的网页;
header就是让程序伪装成特定浏览器(用户代理/user-agent)访问,防止访问量过大而被封ip,得到403或412错误代码;或者防止服务器倒垃圾(假数据),如携程。
当403了也不怕,可以用代理ip,填写到proxies里(淘宝上有卖的,一块钱一万条),轮询ip使得服务器认为你是不同地址来访问,就不会封杀。
为了加快爬虫速度,多线程访问服务器是必须的,这就需要给每个线程分配代理ip了。一般一个ip访问服务器频率在1秒30次以上就可能被封禁半天时间。
如果换浏览器代理+ip代理都不行,就是服务器检查了cookie信息。由于requests咩有禁用服务器调用cookie信息的函数,所以解决方法和上面的proxy池一样,我们可以设立cookie池,这些操作也都是将爬虫伪装成用户的法子;
timeout就是等待服务器返回数据的时间上线。
当然最稳妥的是selenium,这是后话。爬取下来的网页码就可以交给bs4处理了。
bs4用于找寻元素,方便你提取内容。你可以通过:
soup = bs4.BeautifulSoup(searchPage.text,'html.parser')
来解析html码,之后的找寻就很多方法了,简单的如division = soup.find_all(name='div',attrs={"class":"categories"})
。过程可以参考官方手册 https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/很全,英文文档更方便理解,然后csdn和stackoverflow也有很多大神解答问题,基本上有问题都能搜得到解答。
scrapy和pyspider都有完整的网络框架,而且书写更加方便,也适用之后不同项目的使用,但灵活度比requests低很多了。
那么对于进阶版:不想被查封/用机器人操作网页/加载内容/自动登陆/自动输验证码,就必学selenium(核弹级别的库,因为要加载页面,所以比requests访问速度慢很多)。
了解服务器如何发送给用户数据,你就知道如何触发事件/等待网页反应,比如自动搜索、点击按钮、下载视频、抢课、抢票、刷东西。Selenium是一个机器人,运行程序后会有真实的应用被启动,我常用火狐浏览器,运行程序之后这个浏览器就受程序控制自动打开网站。有了selenium你就可以加载缓存,比如下视频什么的。因为一个网站直接用链接访问(re访问)返回的是直接能加载出来的元素,那些等待服务器缓存完传输的数据则不能被re库捕捉,这就要selenium来真实的模拟用户上网这个过程来实现。当然,效率也是相当低的了。但会使用selenium,基本上所有网页都可以被你的程序爬取了。
当然,像淘宝这种网站还专门做了反selenium爬虫的诱饵代码,要特别注意。
拖了一年,我终于肯学api了,现在才发现这是个好东西。selenium和requests都是从客户端角度爬取服务器传输过来的数据,这些数据都是被服务器修饰成html,包装后,传输过程自然也慢。但是不少网站都有自己的api.xxx.com,这个网址把数据给了服务器包装,再传给用户端,所以直接对api下手是我认为最快的爬虫方法。我们可以把通过api解析和或requests库解析当成纯数据收集的方法,而把selenium看成模拟用户操作的方法,各有各的用途。
api实际上就是以json数据形式反馈数据。提取api的方法也就是“抓包”。抓包方法有二:
(一)直接通过浏览器的控制带进行人工筛选:这个api网址的提取是通过浏览器自带的控制台,如chrome浏览器控制台下 network栏里面选取加载网页过程中被引用的相关网页链接(XHR格式),在右侧preview看json内容从而推断出对应元素的api地址;还有一个方式就是抓包,通过分析元素加载过程中向哪些网址(甚至是php文件)请求数据,这些网址可能隐藏在各种js,XHR等等脚本中,浏览器控制台很难提取到。
然后就能批量使用了。这个方法绕开了前端的一系列加载,而是直接从数据源头下手,因此也就更快更稳定。
(二):用抓包软件进行分析:常用的抓包软件(1)Charles:Mac+iPhone;(2)Fiddler:Windows+Android。安装好,关掉,这类抓包软件就能时时加载你的电脑和哪些服务器有数据交换,包括http和https。之后就可以看到所有交换信息的发送对象,发送内容,返回信息,直接搜索关键词来查找api网址也可。这些抓包软件也能在电脑与手机处于同一个局域网下,对手机的通信数据进行加载。不过很多手机软件与服务器都是加密通信,内容不可见,但是仍然可以提取可能的目标网址(或目标临时网址,之后可以用cookie刷新访问key进行爬取,例如微信公众号主页链接的key只有两个小时的时效性,更新cookie则可续时间),因此学完了抓包,您就毕业啦!
为了方便项目组员处理数据,我一般都把转换好的数据存在excel里(默认格式为通用,数字就需要单独转换了)。具体操作方法可以看官方文档,我这里常用的代码就是sheet.cell(row=1, column=1).value = xxxx
来输入数据。当然大家可以选择自己喜欢的储存格式。
JSON相当于嵌套字典,和SQL一项都是很好用的数据库。我一般用XAMPP+SQL,选择MySQL(很容易上手)而非MangoDB(优化更好,用于储存长字节)。数据库的使用不要太方便呀,而且线上远程操作是更方便也更实时。像白嫖宝塔面板(后端)之类的+腾讯云/阿里云低价域名,大家数据库就可以在云端操作~
以上就是非常简单的爬虫入门了,能处理绝大多数的网站,下面是一些小结:
(1)我在学习网络前段编程的过程全部在记事本上完成。如果大家想用编译器也可,比如notepad++,和visual studio code。
(2)以上这些库都是pip install xxxx安装的。
(3)学习时间差不多一个半月,每天四五个小时这样,学完了都可以自己去做网页前端了。
(4)推荐的教程就是油管大神EJMedia的课,讲的真的详细,英语发音也很清楚,我的搬运地址在
HTML - https://www.bilibili.com/video/BV1q7411e7Sy
CSS - https://www.bilibili.com/video/BV1B741167GH 以及 https://www.bilibili.com/video/BV1vV411o7f5
然后就是菜鸟教程了,建议多读读每部分教程下方的评论,对内容理解与新版本特性帮助很大。最后,各个官方文档也很推荐,尤其是bs4和openpyxl库。
(5) HTML /CSS /JavaScript /PHP风格都跟C++类似,学过C++的同学也就能学得快了。
说说我做项目的感想吧。(1),这个项目数据一定够大够复杂,而且会被反复使用,要不然开发相应的代码可能要2-3天,用几天就不再用了,不是很回本。个人经验就是超过5千条数据,最好就爬虫做了,要不然第二天手腕酸脖子疼是免不了的。(2),正规网站爬取相当便捷,因为他们所有相似页面的代码统一,而且不会怎么变化,代码只需要考虑少量情况。对于一般网站,例如WHO的网站,代码很不规律,比如SARS的各国每日确诊数据汇总就是,除了数据都储存在table里,网页和网页间的代码相似度很低,不能在爬取的时候自动整理数据,最后我只能暴力爬取table里所有数据,最后再手动清理数据了。(3),requests库稳定性差,如果timeout 5分钟都不行的,建议重新跑程序,在我做WHO数据收集的时候,运行3次,只有1次成功的,其他都是服务器挂了连不上。(4),selenium是个好东西,但是能不用就不用,不然五分钟的活能搞三个小时。(5),有python基础的同学,自学两个月就差不多出师了,这个真的不难~~(7)抓包+SQL存储是我现在最喜欢的抓大网站数据(均为json返回)的方法,scrapy是最喜欢的抓小网站数据的方法,又快又容易写。现在有接触了服务器方面的知识,包括前后端数据传输(AJAX同步,SQL的操作),也对数据传输,数据加密有了接触,觉的学海无涯,大家加油哦!
写在后面,笔者感觉爬虫自学进程也差不多了,有空也翻了翻同学推荐的爬虫教材,基本上是我所说的这些,大家也可以尝试把爬虫做到PHP中方便搭建服务器。书山有路,每次学新知识,都能把爬虫效率提高一大截,尽管过程很折磨人,但是每次回看自己以前笨拙的代码,都感到进步,觉得蛮开心的。
祝马到成功!
python爬虫之抖音视频批量提取术:https://zhuanlan.zhihu.com/p/46137276 其实我也研究了一下下,用了手机抓包,猜测抖音有v3,v5,v7,v8网站,分开储存视频,音频,图片,文字(雾)
Charles 从入门到精通:https://www.jianshu.com/p/a3f005628d07
version 1 - 初稿 2020年06月30日
version 2 - 微调,增加引用 2020年07月04日
version 3 - 更新api部分 2020年08月7日
version 4 - 更新JQuery,PHP,requests代理,requests多线程, Scrapy,API部分,删减了无关的例子 2020年09月01日
version 5 - 更新api部分的抓包手段和cookie池 2020年09月15日 之后应该不会再添加新内容啦