零基础应该如何学习爬虫技术?

2020 年 04 月 29 日 阅读数: 14
零基础应该如何学习爬虫技术?

在当今数据爆炸的年代,我们经常会进行网络数据的采集和整理。要想学习爬虫技术,一种是自学编程,一种是借助工具。接下来就让我简单介绍一下这两种方法。

Python 爬虫

要想学 Python 爬虫,有两个必须要学的基础:一个是学习 HTML,这个可以借助 MDN 来进行学习,只有掌握了 HTML 才可以了解页面的结构。

另一个是 Python 语言的学习,极客时间里有很多不错的教程可以学习。

 

下面介绍几个学习 Python 爬虫必须学习的 Python 库。

  1. urllib 库

urllib 是 Python 自带的库,可以用来进行网络数据的收集和下载。

 

示例代码:

from urllib import request
url='https://time.geekbang.org/'
response=request.urlopen(url,timeout=1)
print(response.read().decode('utf-8'))

 

只需 4 行,就可以拿到极客时间的首页网页代码。当然,你会发现首页网页的代码只有一部分,这是因为极客时间的大量数据都是通过 JS 请求后台加载的。

 

在这里,我可以介绍一个网站给大家,http: //httpb in.org/,这里有各种各样的接口,我们可以学习请求接口的方法和手段。它会将我们的请求返回给我们,进而可以帮助我们调整自己的程序。

 

  • get 方法发送数据

from urllib import request
url='http://httpbin.org/get'
response=request.urlopen(url,timeout=1)
print(response.read().decode('utf-8'))

 

结果如下:

{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.6",
"X-Amzn-Trace-Id": "Root=1-5e819d13-4cc14dd8db3b5240321d0380"
},
"origin": "",
"url": "http://httpbin.org/get"
}

 

  • post 方法发送数据

默认的请求格式是 application/x-www-form-urlencoded,如果想看 JSON 的,请看文章后面的“JSON 请求接口”的内容。

 

from urllib import request
from urllib import parse
data=bytes(parse.urlencode({'word':'hello wlzcool'}),encoding='utf8')
url='http://httpbin.org/post'
response=request.urlopen(url,data=data)
print(response.read().decode('utf-8'))

结果如下:

{
"args": {},
"data": "",
"files": {},
"form": {
"word": "hello wlzcool"
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "18",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.6",
"X-Amzn-Trace-Id": "Root=1-5e819df5-cc1d4ab38f5b4a59c23d09e9"
},
"json": null,
"origin": "",
"url": "http://httpbin.org/post"
}

 

  • 修改 User-Agent

很多时候我们会发现,我们写得爬虫经常被网站拒绝访问了,原因就是我们的程序没有把自己伪装得像一个正常的用户,被网站发现了这是一个爬虫,直接拒绝了请求。

 

比如我们前面两个请求的 User-Agent,很明显就是 Python 程序的请求头。

"User-Agent": "Python-urllib/3.6",

这个时候我们可以首先把自己的 User-Agent 伪装成一个正常的浏览器。此时需要注意,因为我们需要模拟一些其他的参数,简单的 urlopen 方法已经无法满足我们的需求了,所以我们需要伪装自己的 User-Agent。

import urllib.request
req = urllib.request.Request(
url='http://httpbin.org/get',
data=None,
headers={
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36'
}
)
f = urllib.request.urlopen(req)
print(f.read().decode('utf-8')

结果如下:

{
"args": {},
"headers": {
"Accept-Encoding": "identity",
"Host": "httpbin.org",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
"X-Amzn-Trace-Id": "Root=1-5e81b441-e06aae4672915f7ab2ef9924"
},
"origin": "",
"url": "http://httpbin.org/get"
}
  • JSON 请求接口

代码如下:

from urllib import request
from urllib import parse
import json
data=json.dumps({"is_article":"1","ids":[48,176,98]}).encode('utf8')
req = request.Request(
url='http://httpbin.org/post',
data=data,
headers={
'Content-Type':'application/json',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
},
method='POST'
)
f = request.urlopen(req)
print(f.read().decode('utf-8'))

 

  1. Requests 库

文档地址:https://requests.readthedocs.io/zh_CN/latest/

 

Requests 是 Python HTTP 的客户端库,编写爬虫的时候都会用到,编写起来也很简单。它有两种访问方式:get 和 post。这两者最直观的区别就是:get 把参数包含在 URL 中,而 post 通过 request body 来传递参数。

 

Requests 是一个第三方库,所以需要自行安装。相较 Python 自带的 urllib 而言,就是多了一步

pip install requests

 

但是带来的好处却是更加友好且易读易理解。

 

  • get 方法

代码如下: 

import requests
r=requests.get('http://httpbin.org/get')
print(r.status_code)

我们可以直接从数据中获取我们所需要的部分数据,非常简单。

 

  • post 方法

代码如下:

import requests
url = 'http://httpbin.org'/post
data={"is_article":"1","ids":[48,176,98]}
headers={
'Content-Type':'application/json',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
r = requests.get(url,json=data, headers=headers)
print(r.text
  1. lxml XML 格式处理库

想要对 HTML 进行格式处理,少不了它的帮助。

 

  • XPath定位

如果想从 HTML 中获取文本,那么就要通过元素和属性进行导航,从而帮助我们定位位置。

 

几种常用的路径表达方式如下:

所以就需要我们的 lxml 登场。

  • lxml

这段代码可以帮助我们获取到 HTML 文档中的所有的div:

from lxml import etree
from urllib import request
url='https://time.geekbang.org/'
response=request.urlopen(url,timeout=1)
html=response.read().decode('utf-8')
html = etree.HTML(html)
result = html.xpath('//div')
for child in result:
print(child.tag)

其他类型工具

你可能觉得要学一门编程语言来进行数据爬取时间耗费太长,我就是想用个工具对数据进行爬取,有没有省事一点的方法。不编程就能抓取网页信息的工具,这里介绍三款给你。

1. 火车采集器

火车采集器已经有 13 年历史了,是老牌的采集工具。它不仅可以做抓取工具,也可以做数据清洗、数据分析、数据挖掘和可视化等工作。数据源适用于绝大部分的网页,网页中能看到的内容都可以通过采集规则进行抓取。

 

  1. 八爪鱼

八爪鱼也是知名的采集工具,它有两个版本,一个就是免费的采集模板,还有一个就是付费的云采集。免费的采集模板实际上就是内容采集规则,包括了电商类、生活服务类、社交媒体类和论坛类的网站都可以采集,用起来非常方便。当然你也可以自己来自定义任务。

 

那什么是云采集呢?就是当你配置好采集任务,就可以交给八爪鱼的云端进行采集。八爪鱼一共有 5000 台服务器,通过云端多节点并发采集,采集速度远远超过本地采集。此外还可以自动切换多个 IP,避免 IP 被封,影响采集。

 

极客时间的《数据分析实战45讲》第九课给我们讲解了如何用八爪鱼进行数据爬取,如果你想了解可以去学习一下。

 

  1. 集搜客

这个工具的特点是完全可视化操作,无需编程。整个采集过程也是所见即所得,抓取结果信息、错误信息等都反映在软件中。相比于八爪鱼来说,集搜客没有流程的概念,用户只需要关注抓取什么数据,而流程细节完全交给集搜客来处理。但是集搜客的缺点是没有云采集功能,所有爬虫都是在用户自己电脑上跑的。

 

如果你想真正掌握爬虫技术,那么必须要学习的是 Python。因为各种工具总会有种种限制,只有自己写的 Python 程序才能真正实现自己想要得到的功能,并以自己想要的格式拿到自己想要的数据。

编辑 | wlzcool

用户头像

极客时间

关注

极客时间,一种新的学习方式 2018.10.30 加入

面向 IT 领域的知识服务产品,通过好内容、好产品、好服务,帮助用户轻松学习、高效学习。 APP/ 公众号 / 微博 / B站 / 知乎 :@极客时间

评论

发布
暂无评论
零基础应该如何学习爬虫技术?-InfoQ写作平台