Python之带你认识爬虫技术
在当今数据爆炸时代,我们经常收集和组织网络数据。 如果要学习爬虫技术,一种是自学编程,另一种是使用工具。 接下来让我简要介绍这两种方法。
Python 爬虫
要想学 Python 爬虫,有两个必须要学的基础:一个是学习 HTML,这个可以借助 MDN 来进行学习,只有掌握了 HTML 才可以了解页面的结构。
另一个是 Python 语言的学习,极客时间里有很多不错的教程可以学习。
下面介绍几个学习 Python 爬虫必须学习的 Python 库。
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'))
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
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 年历史了,是老牌的采集工具。它不仅可以做抓取工具,也可以做数据清洗、数据分析、数据挖掘和可视化等工作。数据源适用于绝大部分的网页,网页中能看到的内容都可以通过采集规则进行抓取。
八爪鱼
八爪鱼也是知名的采集工具,它有两个版本,一个就是免费的采集模板,还有一个就是付费的云采集。免费的采集模板实际上就是内容采集规则,包括了电商类、生活服务类、社交媒体类和论坛类的网站都可以采集,用起来非常方便。当然你也可以自己来自定义任务。
那什么是云采集呢?就是当你配置好采集任务,就可以交给八爪鱼的云端进行采集。八爪鱼一共有 5000 台服务器,通过云端多节点并发采集,采集速度远远超过本地采集。此外还可以自动切换多个 IP,避免 IP 被封,影响采集。
极客时间的《数据分析实战45讲》第九课给我们讲解了如何用八爪鱼进行数据爬取,如果你想了解可以去学习一下。
集搜客
这个工具的特点是完全可视化操作,无需编程。整个采集过程也是所见即所得,抓取结果信息、错误信息等都反映在软件中。相比于八爪鱼来说,集搜客没有流程的概念,用户只需要关注抓取什么数据,而流程细节完全交给集搜客来处理。但是集搜客的缺点是没有云采集功能,所有爬虫都是在用户自己电脑上跑的。
如果你想真正掌握爬虫技术,那么必须要学习的是 Python。因为各种工具总会有种种限制,只有自己写的 Python 程序才能真正实现自己想要得到的功能,并以自己想要的格式拿到自己想要的数据。