爬虫能做什么
2016年这场美国总统竞选被媒体称作“第一次数字化竞选”,希阿姨和川大大都组建了庞大的技术团队,将大量资金花在获取和使用投票者的信息上。民意调查结果,一直是总统大选时最倚重的数据来源。在长达半年的总统竞选活动中,会有许多组织或机构通过不同方式进行大量调查,并将结果汇总整理加工成民意调查数据。在更大的数据规模上,总统候选人们也采用了同样的策略,所依赖的数据来源也不仅仅是民意调查结果,还涵盖了诸多的如facebook这类的社交网站和公开及私有的数据库。
及时准确的收集这些数据,并且帮助制定策略以获得更多的选民支持。将美国超过2亿的选民资料,与大型网站与社交网络上的个人账号相互匹配起来,将网络行为对应到具体的个体,再和已经构成的、庞大的用户个人数据相结合,最终完全由准确数据来驱动竞选策略。
而以上这些就使得大数据分析技术成了两党候选人的重要武器。
抓取天猫、京东、淘宝等电商网的评论及销量数据,对各种商品(颗粒度可到款式)沿时间序列的销量以及用户的消费场景进行分析。
甚至还可以根据用户评价做情感分析,实时监控产品在消费者心目中的形象,对新发布的产品及时监控,以便调整策略。
雪球等财经类网站通过抓取雪球KOL或者高回报用户的行为,找出推荐股票。
在大众点评、美团网等餐饮及消费类网站抓取各种店面的开业情况以及用户消费和评价,了解周边变化的口味,所谓是“舌尖上的爬虫”。
以及各种变化的口味,比如:啤酒在衰退,重庆小面在崛起。
企业在运营过程中产生的大量数据,其实是蕴含着巨大的价值,对企业未来的发展和创新商业模式都有着很大的帮助。充分的挖掘数据潜在价值,能帮助企业更好的细分市场,以助于公司能有针对性的为企业日后的发展提供数据支撑。更好的掌握市场动向,更好的对市场反应产生新的决策。
数据背后所隐藏的巨大商业价值正开始被越来越多的企业所重视,越来越多的企业开始进入大数据市场,建立各种大数据入口,以获得更多更大的海量数据。那么问题来了,数据从何而来?
什么是网络爬虫
所谓爬虫,其本质是一种计算机程序,它的行为看起来就像是蜘蛛在网上面爬行一样,顺着互联网这个“网”,一条线一条线地“爬行”。所以爬虫在英文中又叫作“Spider”,正是蜘蛛这个单词。
由于传统低效率的数据收集手段越来越不能满足当今日益增长的数据需求,但是面对互联网这样一个由数据构建而成的海洋,如何有效获取数据,如何获取有效数据都是极其劳神费力、浪费成本、制约效率的事情。很多时候,按照传统手段完成一个项目可能80%~90%的时间用于获取和处理数据。这样的矛盾冲突,搁在以往,搁在普通的人和普通的公司身上,除了用金钱去填补(直接购买数据)之外,似乎只有默默认命了。
然而现在,终于有了扭转之机,那就是驾驭爬虫技术。
urllib库是爬虫常用的一个库,通过这个库的学习,能够了解一些爬虫的基础技术。
下面以爬取某网站首页源码的示例代码介绍urilib库中常用的request()方法:
# 导入urllib库
import urllib.request
# urllib爬取某网站首页的步骤:
# (1) 定义一个url 即目标地址
url = 'http://www.xxx.com'
# (2) 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(url)
# (3) 获取响应中的页面的源码
# 这里read()函数可以获取响应,但是响应的格式是二进制的,需要解码
# 解码:decode('编码格式') 编码格式在 <head><meta chaset ></head>中显示
content = response.read().decode('utf-8')
# (4) 打印数据
print(content)
下面介绍一下用urllib.request()方法如何下载文件:
# urllib下载文件的操作
# (1) 下载网页
url_page = 'http://www.baidu.com'
# 使用urillib.request.urlretrieve() 函数,
# 传参分别是url(网页的地址路径)、filename(网页文件的名字)
urllib.request.urlretrieve(url_page,'baidu.html')
# (2) 下载图片
url_img = 'https://xxx'
urllib.request.urlretrieve(url_img,'xxx.jpg')
# (3) 下载视频
url_video = 'https://xxx'
urllib.request.urlretrieve(url_video,'xxx.mov')
# get请求的quote()方法:单个参数的情况下常用该方法进行编解码
# 需求:用get请求的quote()方法获取源码
# 找到网页地址url:此时复制的汉字会自动转成unicode编码,如下,即这段编码就是周杰伦三个汉字的编码
url = 'https://www.baidu.com/s?wd=%E5%91%A8%E6%9D%B0%E4%BC%A6'
# 寻找UA
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
# 定制请求对象
request = urllib.request.Request(url = url,headers = headers)
# 模拟浏览器向服务器发起请求
response = urllib.request.urlopen(request)
# 获取响应内容
content = response.read().decode('utf-8')
# 打印内容
print(content)
# post请求:
import urllib.request
url = 'https://xxx'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
data = {
'data':'data'
}
import urllib.parse
# post请求的参数 必须 进行编码
data = urllib.parse.urlencode(data).encode('utf-8')
# post请求的参数是不会拼接在url 的后面的,而是需要放置在请求对象定制的地方
request = urllib.request.Request(url = url,data = data,headers = headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 获取响应的数据
content = response.read().decode('utf-8')
import json
# 字符串 - - - > json 对象
obj = json.loads(content)
print(obj)
首先简单介绍一下handler处理器:handler处理器是urllib库中继urlopen()方法之后又一种模拟浏览器向服务器发起请求的方法或技术。
它的意义在于使用handler处理器,能够携带代理ip,这为对抗反爬机制提供了一种策略(很多的网站会封掉短时间多次访问的ip地址)。
下面是handler处理器的具体使用方法,其中不含代理ip的部分,代理ip这部分将在下一篇笔记中介绍。
# handler处理器的基础使用
# 需求:使用handler访问百度 获取网页源码
import urllib.request
url = 'http://www.baidu.com'
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
request = urllib.request.Request(url = url,headers = headers)
# handler build_opener open
# 第一步:获取handler对象
handler = urllib.request.HTTPHandler()
# 第二步:通过handler获取opener对象
opener = urllib.request.build_opener(handler)
# 第三步:调用open()函数
response = opener.open(request)
content = response.read().decode('utf-8')
print(content)
# urllib代理
import urllib.request
url = 'https://www.xxx'
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
proxies = {
'http' : '40.83.102.86:80'
}
request = urllib.request.Request(url = url, headers = headers)
handler = urllib.request.ProxyHandler(proxies = proxies)
opener = urllib.request.build_opener(handler)
response = opener.open(request)
content = response.read().decode('utf-8')
with open('daili.html','w',encoding = 'utf-8') as fp:
fp.write(content)
首先,了解一下什么是requests库:
它是一个Python第三方库,处理URL资源特别方便,可以完全取代之前学习的urllib库,并且更加精简代码量(相较于urllib库)。
用requests库时,我们发起请求是通过requests.get()函数进行的,传参是目的网页的url(后续会有其他的传参,暂时此处传入一个url),并且用response变量接受服务器的响应。
import requests
url = 'http://www.xxx.com'
response = requests.get(url = url)
1?? text属性:字符串形式返回网页源码(由于此时编码格式是gbk,中文部分可能会乱码,稍后解决)
print(response.text) # 由于没有设置编码格式,中文会乱码
2?? encoding属性:设置相应的编码格式
response.encoding = ‘utf-8’
这之后的response就不会出现中文乱码现象了。
3?? url属性:返回url地址
url = response.url
4?? content属性:返回二进制的数据
content_binary = response.content
5?? status_code属性:返回状态码 200是正常
status_code = response.status_code
6?? headers属性:返回响应头
headers = response.headers
import requests
url = 'https://www.xxx.com'
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
data = {
'data' : 'data'
}
response = requests.get(url = url,params = data,headers = headers)
response.encoding = 'utf-8'
content = response.text
print(content)
# requests_post请求
import requests
url = 'https://www.com'
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
data = {
'data' : 'xxx'
}
response = requests.post(url = url,data = data,headers = headers)
content = response.text
import json
obj = json.loads(content.encode('utf-8'))
print(obj)
# requests_ip代理
import requests
url = 'http://www.baidu.com/s'
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Safari/537.36'
}
data = {
'wd' : 'ip'
}
proxy = {
'http:' : '218.14.108.53'
}
response = requests.get(url = url, params = data,headers = headers,proxies = proxy)
content = response.text
在第一部分安装的介绍之前,先介绍一下什么是xpath,以及为什么我们要学习xpath:
首先,介绍一下bs4,它是又一种解析的手段,之前有xpath和jsonpath。bs4的特点是这样的:
BS4全称是Beatiful Soup,它提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。
BS4最舒服的一点是提供了更适合前端开发工作者使用的语言习惯,它的语法很大程度对前端开发工作者是友好的,同时它解析的对象是本地html文件和服务器的响应html文件。
本地html的源码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>soupDemo</title>
</head>
<body>
<div>
<ul>
<li id = "l1">张三</li>
<li id = "l2">李四</li>
<li>王五</li>
<li>周六</li>
<a href="" id = "" class = "s1">soupDemo</a>
<span>hhh</span>
</ul>
</div>
<a href="" id = "s2" title = "s2">soupDemo2</a>
</body>
</html>
bs4的基本操作语法:
# 解析本地文件:bs4基础语法的学习
soup = BeautifulSoup(open('soup.html',encoding = 'utf-8'),'lxml')
# bs4的基础操作:
# (1) 根据标签名查找节点,找到的是第一个符合条件的节点:
print(soup.a) # 返回的是soupDemo而不是soupDemo2
# (2) 获取标签的属性:
print(soup.a.attrs)
反爬虫方式
一般而言,抓取稍微正规一点的网站,都会有反爬虫的制约。反爬虫主要有以下几种方式:
通过UA判断:这是最低级的判断,一般反爬虫不会用这个做唯一判断,因为反反爬虫非常容易,直接随机UA即可解决。
通过单IP频繁访问判断:这个判断简单,而且反反爬虫比较费力,反爬虫绝佳方案。需采用多IP抓取。
通过Cookie判断:例如通过会员制账号密码登陆,判断单账号短时间抓取次数判断。这个反反爬虫也很费力。需采用多账号抓取。
动态页面加载:这个考验前端工程师的功底,如果前端写的好,各种JS判断,各种逻辑,像百度、淘宝一样,post登录很难。较好的方法,但是对于大牛,还是防不胜防。反反爬虫多采用渲染浏览器抓取,效率低下。
采用验证码:这里要么是登录的时候有验证码,要么是判断是爬虫时,不封IP,而是采用验证码验证,例如链家网。验证码是反爬虫性价比较高的方案。反反爬虫一般接入OCR验证码识别平台或者人工打码平台,亦或者利用TesseractOCR识别,亦或者采用神经网络训练识别验证码等。
如何反反爬虫
修改请求头:除了处理网站表单,requests 模块还是一个设置请求头的利器。HTTP 的请求头是在你每次向网络服务器发送请求时,传递的一组属性和配置信息。HTTP 定义了十几种古怪的请求头类型,不过大多数都不常用。只有下面的七个字段被大多数浏览器用来初始化所有网络请求(表中信息是我自己浏览器的数据)。
修改爬虫的间隔时间:修改爬虫的间隔时间,使用随机间隔时间,模拟访问操作。合理控制速度是你不应该破坏的规则。所以请控制采集速度!
使用代理:上网者可以通过正向代理的方法隐藏自己的 ip。正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端。正向代理的情况下,客户端必须要进行一些特殊的设置才能使用。
登录获取数据:在采集一些网站时 cookie 是不可或缺的。要在一个网站上持续保持登录状态,需要在多个页面中保存一个 cookie。有些网站不要求在每次登录时都获得一个新 cookie,只要保存一个旧的“已登录”的 cookie 就可以访问。
小编是一名Python开发工程师,自己整理了一套 【最新的Python系统学习教程】,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。
保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
如果你是准备学习Python或者正在学习,下面这些你应该能用得上:
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
用通俗易懂的漫画,来教你学习Python,让你更容易记住,并且不会枯燥乏味。
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
👉CSDN大礼包:《Python入门资料&实战源码&安装工具】免费领取(安全链接,放心点击)