前导:做网络爬虫(Web crawler)是方便大量收集、跟踪数据的相当便捷的方法。笔者在过去一年内,做过上市项目信息收集,WHO官网致病数数据收集,京东商品信息收集,以及Bilibili视频信息收集,微信公众号历史文章抓包,各大媒体网站数据抓包,并尝试在服务器搭载爬虫。之前的项目中,全靠自己摸索如何掌握爬虫所需要的前置知识,并不断找到更快的爬虫方案,现汇成一个新手指引分享给大家,希望对想自学/提高生产力的同学们有帮助。如果有不妥当的地方,欢迎大家在评论区指正~

目录:

  • 自学流程简述
  • 自学流程简述
      • -Python/Java
      • -HTML
      • -CSS
      • -JavaScript(js)
      • -JQuery
      • -PHP
  • 所需自学的外置库
      • -Requests库
      • -多线程与分布式爬虫
      • -BeautifulSoup4(bs4)库
      • -Scrapy库
      • -Selenium库
      • -调取api
  • 所需自学数据储存流程:
      • -Openpyxl库
      • -JSON/SQL
  • 爬虫基础内容小结与课程推荐
  • 个人感受
  • 相关软件
  • 其他
  • 稿件版本

全文7538字,可以先存着,学习过程中慢慢看。本文欢迎转载,转载请标明原文出处。

自学流程简述

所需自学的爬虫语言(按顺序):

  1. Python/Java (基础语言,python对新手很友好,但学过C++的同学直接上手Java就好了)
  2. HTML (通过脚本,能找到所要爬取内容对应的Element)
  3. CSS (通过Style sheet,找到Element的路径)
  4. JavaScript (了解网页与服务器交互原理,从而绕过前端(HTML),找到对应服务器,直接提取数据)
  5. JQuery (对JavaScript进行补充,了解前后端如何进行数据交互)
  6. PHP (了解后端的运作方式,但不是必备知识)

所需自学的外置库

  1. urllib3库 (以爬虫(crawler)本身身份向服务器发请求,现在会被服务器直接封杀)
  2. Python Requests库 (伪装成浏览器向服务器发请求,得到html代码,最为常用)
  3. 抓包+API爬虫 (用requests,只不过在抓包分析了服务器数据来源网址,直接访问储存的数据,比爬html网页前端快多了)
  4. Scrapy库(是一个完整的爬虫构架,有访问,有缓存,有并发。如果说requests+bs4是散装零件,scrapy就是整机,更容易上手,但灵活性也降低了)
  5. Python BeasutifulSoup4(bs4)库 (解析爬取下来的网页html代码,从而找到对应元素)
  6. Python Selenium库 (用机器人完全模仿浏览器,直接打开搜索引擎,模仿用户操作爬取内容,最慢的爬虫,但基本不会被封杀) (其自带的html解析方法不逊于bs4); PhantomJS跟selenium一样,只不过无界面,节省内存。

所需自学数据储存流程:

  1. txt/csv读写
  2. Python openpyxl (Excel读写)
  3. json (在后期API调用数据时能直接将发来的json转化为dictionary)
  4. sql/mangoDB读写 (数据库读写,方便将爬虫搬运到服务器上运行)

自学流程简述

为了写爬虫,所学这些语言的目的如下:

-Python/Java

笔者目前只接触了C++和Python两个基础语言,Python相对来说容易上手,对运行时间和内存分配没有编程要求,而且安装的库也丰富而且容易上手,所以之前的案例我都是用Python完成的,基本学完了函数就能解决爬虫问题。此外,Java也支持很多外置库,而且跟前后端语言结合度更好,也很推荐使用。

-HTML

HTML是爬虫的入门语言,想要爬取网页上的数据,就得能读得懂网页代码内容,你不学HTML就没法明白爬虫!

一般都是ctrl+shift+C (windows)或者command+shift+C(Mac)来查看网页源代码,然后找到所要爬取的元素的路径,建议使用Chrome浏览器debug console。这个路径下的元素就可以被bs4库解析后找出来,元素内的文字部分或本身者链接部分就可以被转换为字符串了,可以保存在本地。

也有不少网页的数据储存在不同结构里,比如表格、下拉条、选项框内,因此就要懂得找不同的元素,通过学习HTML即可。对于动态元素,比如下拉刷新页面了之后才能呈现的,这我就放到Selenium部分讲解。对于"Get"服务器直接就能返回的HTML代码,requests库就能爬取下来。

-CSS

会了HTML就已经成功一大半了,找元素自然可以根据元素种类和名称来找。但有些元素的html路径并不是固定的,而可能随着页面尺寸改变而改变,这就需要CSS/Xpath来找元素。

在下面这个图里面,copy的路径可以是html(外部html和内部html), Xpath(相对路径),以及selector path(通过css筛选器选取元素)。学习HTML可以方便你了解元素作为文本,是如何存的。 学习CSS可以方便你了解元素的呈现格式(位置,大小,颜色)是怎么样的,从而能更准确的找到元素。CSS会让你的代码更灵活。

我之前在做京东商品信息爬虫时,就遇到翻页按钮被透明图片遮罩(程序员在耍小聪明啊),于是selenium就傻乎乎的点了透明按钮,然后就给封禁了。所以CSS selector也可能没有用,这个时候就要考虑xpath了。

-JavaScript(js)

js就和事件触发有关了,比如按按钮/按回车/输内容后网页的反馈,这种事件触发受js控制,比如bilibili上搜索页的翻页特效由js代码控制,这代码是相当长的,并且是存放在github上,由b站服务器随取随用。不少网站是在触发了按钮等事件后,元素才能被加载出来。学习js能方便你对事件(event)的了解,这在Selenium爬虫出就很有用了。

JS相当于中台,html和css在客户端浏览器渲染,而js让html的按钮之流得以与服务器的数据交互,让前端活起来。JS就是负责沟通前端(HTML)和后端(PHP)的一个脚本语言。

-JQuery

JQuery实际上是升级版的JS,支持更多的HTML操作功能,和前端与服务端的交互功能;类似的还有Angular,Vue.js,React.js。可以作为js的补充。这些框架使得前端和后端交互效率更高(多线程+分布式)。类似的还有AJAX,链接不变,内容改变,就是用AJAX实现的(应对这个要不就用selenium,要不就用httprequest等高级能缓存的库)。

-PHP

-php就是真正的服务端了,用于处理html/js等前端程序发来的操作请求,调用数据库等服务器功能,再把调用的数据反回给前端。笔者现在正在学习服务器交互和写服务器,发现在PHP中用curl作为爬虫工具,与服务器交互的效率大过本地的requests库与服务器交互效率。而且对要调用API的爬虫来说更方便编码和更新管理。当然,作为服务器语言,php可以和html混用,但php只在服务器执行,用户根本不可能在前端看到php的代码。

b站就把视频三维数据存在json大库里,外界可访问,这样就减少了php与服务器sql数据库交互的时间,减轻了服务器压力,使得数据更快的传到客户端。所以我们可以攻破服务器的数据地址,抓取api。

所需自学的外置库

-Requests库

-知道了网页组成和服务器如何与用户交互,接下来就是学习如何通过链接打开网站、并返回第一时间所加载出的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池,这些操作也都是将爬虫伪装成用户的法子;这些proxy和cookie可以买数据,也可以根据生成的正则表达式自己写,也可以selenium爬取。

-timeout就是等待服务器返回数据的时间上限。

-当然最稳妥的是selenium,这是后话。爬取下来的网页码就可以交给bs4处理了。

-给你们看看最基础款的服务器反爬虫功能👇

你们每次访问服务器,所用的浏览器信息(什么浏览器,什么内核,在那个系统上)、ip地址(能看到经纬度,精确到各位)、之前登录的痕迹,都会被服务器自动记住,记载cookie或session文件里。所以爬虫就不能经常用同一个身份访问服务器。

-BeautifulSoup4(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库

scrapy和pyspider都有完整的网络框架,而且书写更加方便,也适用之后不同项目的使用,但灵活度比requests低很多了。当然,推荐新手上手就用scrapy,但你会了requests与多线程,也就无所谓了。

-Selenium库

那么对于进阶版:不想被查封/用机器人操作网页/加载内容/自动登陆/自动输验证码,就必学selenium(核弹级别的库,因为要加载页面,所以比requests访问速度慢很多)。

了解服务器如何发送给用户数据,你就知道如何触发事件/等待网页反应,比如自动搜索、点击按钮、下载视频、抢课、抢票、刷东西。

Selenium是一个机器人,运行程序后会有真实的应用被启动,我常用火狐浏览器,运行程序之后这个浏览器就受程序控制自动打开网站。有了selenium你就可以加载缓存,比如下视频什么的。

因为一个网站直接用链接访问(re访问)返回的是直接能加载出来的元素,那些等待服务器缓存完传输的数据则不能被re库捕捉,这就要selenium来真实的模拟用户上网这个过程来实现。当然,效率也是相当低的了。

但会使用selenium,基本上所有网页都可以被你的程序爬取了。
当然,像淘宝这种网站还专门做了反selenium爬虫的诱饵代码,要特别注意。

-调取api

拖了一年,我终于肯学api了,现在才发现这是个好东西。selenium和requests都是从客户端角度爬取服务器传输过来的数据,这些数据都是被服务器修饰成html,包装后,传输过程自然也慢。但是不少网站都有自己的api.xxx,这个网址把数据给了服务器包装,再传给用户端,所以直接对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。安装好,关掉vpn,这类抓包软件就能时时加载你的电脑和哪些服务器有数据交换,包括http和https。之后就可以看到所有交换信息的发送对象,发送内容,返回信息,直接搜索关键词来查找api网址也可。这些抓包软件也能在电脑与手机处于同一个局域网下,对手机的通信数据进行加载。不过很多手机软件与服务器都是加密通信,内容不可见,但是仍然可以提取可能的目标网址(或目标临时网址,之后可以用cookie刷新访问key进行爬取,例如微信公众号主页链接的key只有两个小时的时效性,更新cookie则可续时间),因此学完了抓包,您就毕业啦!

所需自学数据储存流程:

-Openpyxl库

为了方便项目组员处理数据,我一般都把转换好的数据存在excel里(默认格式为通用,数字就需要单独转换了)。具体操作方法可以看官方文档,我这里常用的代码就是sheet.cell(row=1, column=1).value = xxxx来输入数据。当然大家可以选择自己喜欢的储存格式。

-JSON/SQL

JSON相当于嵌套字典,和SQL一项都是很好用的数据库。我一般用XAMPP+SQL,选择MySQL(很容易上手)而非MangoDB(优化更好,用于储存长字节)。数据库的使用不要太方便呀,而且线上远程操作是更方便也更实时。像白嫖宝塔面板(后端)之类的+腾讯云/阿里云低价域名,大家数据库就可以在云端操作~

爬虫基础内容小结与课程推荐

以上就是非常简单的爬虫入门了,能处理绝大多数的网站,下面是一些小结:
(1)我在学习网络前段编程的过程全部在记事本上完成。如果大家想用编译器也可,比如notepad++,和visual studio code。
(2)以上这些库都是pip install xxxx安装的。
(3)学习时间差不多一个半月,每天四五个小时这样,学完了都可以自己去做网页前端了。
(4)推荐的教程就是油管大神EJMedia的课,讲的真的详细,英语发音也很清楚,我的搬运地址在
HTML - https://www.bilibili/video/BV1q7411e7Sy
CSS - https://www.bilibili/video/BV1B741167GH 以及 https://www.bilibili/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是个好东西,但是能不用就不用,不然五分钟的活能搞三个小时。这个就是trade off了,re快,但费服务器资源,容易封禁。selenium慢,效率低,但效率趋近于正常人,也就没必要封禁。

(5),有python基础的同学,自学两个月就差不多出师了,这个真的不难~~

(6)通过xxx/robots.txt查看哪些目录能爬,哪些不能。而且爬虫流量不能超过服务器流量1/3,不能盗取服务器的用户信息,不能强攻服务器。要不然就要坐牢!像我们这种个人网站就只有10M的网宽,要爬虫占了流量,普通用户的体验就很差。

(7)抓包+SQL存储是我现在最喜欢的抓大网站数据(均为json返回)的方法,scrapy是最喜欢的抓小网站数据的方法,又快又容易写。现在有接触了服务器方面的知识,包括前后端数据传输(AJAX同步,SQL的操作),也对数据传输,数据加密有了接触,觉的学海无涯,大家加油哦!

写在后面,笔者感觉爬虫自学进程也差不多了,有空也翻了翻同学推荐的爬虫教材,基本上是我所说的这些,大家也可以尝试把爬虫做到PHP中方便搭建服务器。书山有路,每次学新知识,都能把爬虫效率提高一大截,尽管过程很折磨人,但是每次回看自己以前笨拙的代码,都感到进步,觉得蛮开心的。

祝马到成功!

相关软件

  1. 后裔采集器(基于selenium+plantomJS的采集器,可白嫖,很香,但是复杂任务还是不行)
  2. 八爪鱼采集器 (行业标杆,基于selenium+plantomJS的采集器)
  3. Charles(proxy debugger)

其他

python爬虫之抖音视频批量提取术:https://zhuanlan.zhihu/p/46137276 其实我也研究了一下下,用了手机抓包,猜测抖音有v3,v5,v7,v8网站,分开储存视频,音频,图片,文字(雾)
Charles 从入门到精通:https://www.jianshu/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日 之后应该不会再添加新内容啦
version6 - 我开了一个爬虫讲座,讲了几个项目,有些感触。博文添加了一些解释,添加了一些例子,丰富生动了些。2020年12月01日

更多推荐

【指引】新手如何自学网页爬虫(更新完结)