怎样开电商,襄阳抖音seo找哪家,淘宝客推广网站模板,网站建设公司客户分析网络爬虫#xff08;又称为网页蜘蛛#xff0c;网络机器人#xff0c;在FOAF社区中间#xff0c;更经常的称为网页追逐者#xff09;#xff0c;是一种按照一定的规则#xff0c;自动地抓取万维网信息的程序或者脚本。从功能上来讲#xff0c;爬虫一般分为数据采集又称为网页蜘蛛网络机器人在FOAF社区中间更经常的称为网页追逐者是一种按照一定的规则自动地抓取万维网信息的程序或者脚本。从功能上来讲爬虫一般分为数据采集处理储存三个部分。传统爬虫从一个或若干初始网页的URL开始获得初始网页上的URL在抓取网页的过程中不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂需要根据一定的网页分析算法过滤与主题无关的链接保留有用的链接并将其放入等待抓取的URL队列。然后它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL并重复上述过程直到达到系统的某一条件时停止。另外所有被爬虫抓取的网页将会被系统存贮进行一定的分析、过滤并建立索引以便之后的查询和检索对于聚焦爬虫来说这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。本文介绍Python网络爬虫编程的方方面面。 网络数据采集概述
爬虫crawler也经常被称为网络蜘蛛spider是按照一定的规则自动浏览网站并获取所需信息的机器人程序自动化脚本代码被广泛的应用于互联网搜索引擎和数据采集。使用过互联网和浏览器的人都知道网页中除了供用户阅读的文字信息之外还包含一些超链接网络爬虫正是通过网页中的超链接信息不断获得网络上其它页面的地址然后持续的进行数据采集。正因如此网络数据采集的过程就像一个爬虫或者蜘蛛在网络上漫游所以才被形象的称为爬虫或者网络蜘蛛。
爬虫的应用领域
在理想的状态下所有 ICPInternet Content Provider都应该为自己的网站提供 API 接口来共享它们允许其他程序获取的数据在这种情况下就根本不需要爬虫程序。国内比较有名的电商平台如淘宝、京东等、社交平台如微博、微信等等都提供了自己的 API 接口但是这类 API 接口通常会对可以抓取的数据以及抓取数据的频率进行限制。对于大多数的公司而言及时的获取行业数据和竞对数据是企业生存的重要环节之一然而对大部分企业来说数据都是其与生俱来的短板。在这种情况下合理的利用爬虫来获取数据并从中提取出有商业价值的信息对这些企业来说就显得至关重要的。
爬虫的应用领域其实非常广泛下面我们列举了其中的一部分有兴趣的读者可以自行探索相关内容。 搜索引擎 新闻聚合 社交应用 舆情监控 行业数据
爬虫合法性探讨
经常听人说起“爬虫写得好牢饭吃到饱”那么编程爬虫程序是否违法呢关于这个问题我们可以从以下几个角度进行解读。 网络爬虫这个领域目前还属于拓荒阶段虽然互联网世界已经通过自己的游戏规则建立起了一定的道德规范即 Robots 协议全称是“网络爬虫排除标准”但法律部分还在建立和完善中也就是说现在这个领域暂时还是灰色地带。 “法不禁止即为许可”如果爬虫就像浏览器一样获取的是前端显示的数据网页上的公开信息而不是网站后台的私密敏感信息就不太担心法律法规的约束因为目前大数据产业链的发展速度远远超过了法律的完善程度。 在爬取网站的时候需要限制自己的爬虫遵守 Robots 协议同时控制网络爬虫程序的抓取数据的速度在使用数据的时候必须要尊重网站的知识产权从Web 2.0时代开始虽然Web上的数据很多都是由用户提供的但是网站平台是投入了运营成本的当用户在注册和发布内容时平台通常就已经获得了对数据的所有权、使用权和分发权。如果违反了这些规定在打官司的时候败诉几率相当高。 适当的隐匿自己的身份在编写爬虫程序时必要的而且最好不要被对方举证你的爬虫有破坏别人动产例如服务器的行为。 不要在公网如代码托管平台上去开源或者展示你的爬虫代码这些行为通常会给自己带来不必要的麻烦。
Robots协议
大多数网站都会定义robots.txt文件这是一个君子协议并不是所有爬虫都必须遵守的游戏规则。下面以淘宝的robots.txt文件为例看看淘宝网对爬虫有哪些限制。
User-agent: Baiduspider
Disallow: /User-agent: baiduspider
Disallow: /通过上面的文件可以看出淘宝禁止百度爬虫爬取它任何资源因此当你在百度搜索“淘宝”的时候搜索结果下方会出现“由于该网站的robots.txt文件存在限制指令限制搜索引擎抓取系统无法提供该页面的内容描述”。百度作为一个搜索引擎至少在表面上遵守了淘宝网的robots.txt协议所以用户不能从百度上搜索到淘宝内部的产品信息。 下面是豆瓣网的robots.txt文件大家可以自行解读看看它做出了什么样的限制。
User-agent: *
Disallow: /subject_search
Disallow: /amazon_search
Disallow: /search
Disallow: /group/search
Disallow: /event/search
Disallow: /celebrities/search
Disallow: /location/drama/search
Disallow: /forum/
Disallow: /new_subject
Disallow: /service/iframe
Disallow: /j/
Disallow: /link2/
Disallow: /recommend/
Disallow: /doubanapp/card
Disallow: /update/topic/
Disallow: /share/
Allow: /ads.txt
Sitemap: https://www.douban.com/sitemap_index.xml
Sitemap: https://www.douban.com/sitemap_updated_index.xml
# Crawl-delay: 5User-agent: Wandoujia Spider
Disallow: /User-agent: Mediapartners-Google
Disallow: /subject_search
Disallow: /amazon_search
Disallow: /search
Disallow: /group/search
Disallow: /event/search
Disallow: /celebrities/search
Disallow: /location/drama/search
Disallow: /j/超文本传输协议HTTP
在开始讲解爬虫之前我们稍微对超文本传输协议HTTP做一些回顾因为我们在网页上看到的内容通常是浏览器执行 HTML 超文本标记语言得到的结果而 HTTP 就是传输 HTML 数据的协议。HTTP 和其他很多应用级协议一样是构建在 TCP传输控制协议之上的它利用了 TCP 提供的可靠的传输服务实现了 Web 应用中的数据交换。按照维基百科上的介绍设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法也就是说这个协议是浏览器和 Web 服务器之间传输的数据的载体。关于 HTTP 的详细信息以及目前的发展状况大家可以阅读《HTTP 协议入门》、《互联网协议入门》、《图解 HTTPS 协议》等文章进行了解。
下图是我在四川省网络通信技术重点实验室工作期间用开源协议分析工具 EtherealWireShark 的前身截取的访问百度首页时的 HTTP 请求和响应的报文协议数据由于 Ethereal 截取的是经过网络适配器的数据因此可以清晰的看到从物理链路层到应用层的协议数据。
HTTP 请求通常是由请求行、请求头、空行、消息体四个部分构成如果没有数据发给服务器消息体就不是必须的部分。请求行中包含了请求方法GET、POST 等如下表所示、资源路径和协议版本请求头由若干键值对构成包含了浏览器、编码方式、首选语言、缓存策略等信息请求头的后面是空行和消息体。
HTTP 响应通常是由响应行、响应头、空行、消息体四个部分构成其中消息体是服务响应的数据可能是 HTML 页面也有可能是JSON或二进制数据等。响应行中包含了协议版本和响应状态码响应状态码有很多种常见的如下表所示。 相关工具
下面我们先介绍一些开发爬虫程序的辅助工具这些工具相信能帮助你事半功倍。 Chrome Developer Tools谷歌浏览器内置的开发者工具。该工具最常用的几个功能模块是 应用Application用于查看浏览器本地存储、后台任务等内容本地存储主要包括Cookie、Local Storage、Session Storage等。 网络Network用于 HTTP 请求、HTTP 响应以及与网络连接相关的信息。 源代码Sources用于查看页面的 HTML 文件源代码、JavaScript 源代码、CSS 源代码此外最重要的是可以调试 JavaScript 源代码可以给代码添加断点和单步执行。 控制台Console用于执行一次性代码查看 JavaScript 对象查看调试日志信息或异常信息。控制台其实就是一个执行 JavaScript 代码的交互式环境。 元素ELements用于查看或修改 HTML 元素的属性、CSS 属性、监听事件等。CSS 可以即时修改即时显示大大方便了开发者调试页面。 Postman功能强大的网页调试与 RESTful 请求工具。Postman可以帮助我们模拟请求非常方便的定制我们的请求以及查看服务器的响应。 HTTPie命令行HTTP客户端。 安装。 pip install httpie使用。 http --header http --header https://movie.douban.com/HTTP/1.1 200 OK
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html; charsetutf-8
Date: Tue, 24 Aug 2021 16:48:00 GMT
Keep-Alive: timeout30
Server: dae
Set-Cookie: bid58h4BdKC9lM; ExpiresWed, 24-Aug-22 16:48:00 GMT; Domain.douban.com; Path/
Strict-Transport-Security: max-age15552000
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
X-DOUBAN-NEWBID: 58h4BdKC9lMbuiltwith库识别网站所用技术的工具。 安装。 pip install builtwith 使用。 import sslimport builtwithssl._create_default_https_context ssl._create_unverified_context
print(builtwith.parse(http://www.bootcss.com/)) python-whois库查询网站所有者的工具。 安装。 pip3 install python-whois使用。 import whoisprint(whois.whois(https://www.bootcss.com))爬虫的基本工作流程
一个基本的爬虫通常分为数据采集网页下载、数据处理网页解析和数据存储将有用的信息持久化三个部分的内容当然更为高级的爬虫在数据采集和处理时会使用并发编程或分布式技术这就需要有调度器安排线程或进程执行对应的任务、后台管理程序监控爬虫的工作状态以及检查数据抓取的结果等的参与。 一般来说爬虫的工作流程包括以下几个步骤 设定抓取目标种子页面/起始页面并获取网页。 当服务器无法访问时按照指定的重试次数尝试重新下载页面。 在需要的时候设置用户代理或隐藏真实IP否则可能无法访问页面。 对获取的页面进行必要的解码操作然后抓取出需要的信息。 在获取的页面中通过某种方式如正则表达式抽取出页面中的链接信息。 对链接进行进一步的处理获取页面并重复上面的动作。 将有用的信息进行持久化以备后续的处理。 用Python获取网络数据
网络数据采集是 Python 语言非常擅长的领域上节课我们讲到实现网络数据采集的程序通常称之为网络爬虫或蜘蛛程序。即便是在大数据时代数据对于中小企业来说仍然是硬伤和短板有些数据需要通过开放或付费的数据接口来获得其他的行业数据和竞对数据则必须要通过网络数据采集的方式来获得。不管使用哪种方式获取网络数据资源Python 语言都是非常好的选择因为 Python 的标准库和三方库都对网络数据采集提供了良好的支持。
requests库
要使用 Python 获取网络数据我们推荐大家使用名为requests 的三方库这个库我们在之前的课程中其实已经使用过了。按照官方网站的解释requests是基于 Python 标准库进行了封装简化了通过 HTTP 或 HTTPS 访问网络资源的操作。上课我们提到过HTTP 是一个请求响应式的协议当我们在浏览器中输入正确的 URL通常也称为网址并按下 Enter 键时我们就向网络上的 Web 服务器发送了一个 HTTP 请求服务器在收到请求后会给我们一个 HTTP 响应。在 Chrome 浏览器中的菜单中打开“开发者工具”切换到“Network”选项卡就能够查看 HTTP 请求和响应到底是什么样子的.
通过requests库我们可以让 Python 程序向浏览器一样向 Web 服务器发起请求并接收服务器返回的响应从响应中我们就可以提取出想要的数据。浏览器呈现给我们的网页是用 HTML 编写的浏览器相当于是 HTML 的解释器环境我们看到的网页中的内容都包含在 HTML 的标签中。在获取到 HTML 代码后就可以从标签的属性或标签体中提取内容。下面例子演示了如何获取网页 HTML 代码我们通过requests库的get函数获取了搜狐首页的代码。
import requestsresp requests.get(https://www.sohu.com/)
if resp.status_code 200:print(resp.text)
说明上面代码中的变量resp是一个Response对象requests库封装的类型通过该对象的status_code属性可以获取响应状态码而该对象的text属性可以帮我们获取到页面的 HTML 代码。 由于Response对象的text是一个字符串所以我们可以利用之前讲过的正则表达式的知识从页面的 HTML 代码中提取新闻的标题和链接代码如下所示。
import re
import requestspattern re.compile(ra.*?href(.*?).*?title(.*?).*?)
resp requests.get(https://www.sohu.com/)
if resp.status_code 200:all_matches pattern.findall(resp.text)for href, title in all_matches:print(href)print(title)
除了文本内容我们也可以使用requests库通过 URL 获取二进制资源。下面的例子演示了如何获取百度 Logo 并保存到名为baidu.png的本地文件中。可以在百度的首页上右键点击百度Logo并通过“复制图片地址”菜单项获取图片的 URL。
import requestsresp requests.get(https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png)
with open(baidu.png, wb) as file:file.write(resp.content)说明Response对象的content属性可以获得服务器响应的二进制数据。 requests库非常好用而且功能上也比较强大和完整具体的内容我们在使用的过程中为大家一点点剖析。想解锁关于requests库更多的知识可以阅读它的官方文档。
编写爬虫代码
接下来我们以“豆瓣电影”为例为大家讲解如何编写爬虫代码。按照上面提供的方法我们先使用requests获取到网页的HTML代码然后将整个代码看成一个长字符串这样我们就可以使用正则表达式的捕获组从字符串提取我们需要的内容。下面的代码演示了如何从豆瓣电影获取排前250名的电影的名称。豆瓣电影Top250的页面结构和对应代码如下图所示可以看出每页共展示了25部电影如果要获取到 Top250 数据我们共需要访问10个页面对应的地址是https://movie.douban.com/top250?startxxx这里的xxx如果为0就是第一页如果xxx的值是100那么我们可以访问到第五页。为了代码简单易读我们只获取电影的标题和评分。 import random
import re
import timeimport requestsfor page in range(1, 11):resp requests.get(urlfhttps://movie.douban.com/top250?start{(page - 1) * 25},# 如果不设置HTTP请求头中的User-Agent豆瓣会检测出不是浏览器而阻止我们的请求。# 通过get函数的headers参数设置User-Agent的值具体的值可以在浏览器的开发者工具查看到。# 用爬虫访问大部分网站时将爬虫伪装成来自浏览器的请求都是非常重要的一步。headers{User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36})# 通过正则表达式获取class属性为title且标签体不以开头的span标签并用捕获组提取标签内容pattern1 re.compile(rspan classtitle([^]*?)/span)titles pattern1.findall(resp.text)# 通过正则表达式获取class属性为rating_num的span标签并用捕获组提取标签内容pattern2 re.compile(rspan classrating_num.*?(.*?)/span)ranks pattern2.findall(resp.text)# 使用zip压缩两个列表循环遍历所有的电影标题和评分for title, rank in zip(titles, ranks):print(title, rank)# 随机休眠1-5秒避免爬取页面过于频繁time.sleep(random.random() * 4 1)说明通过分析豆瓣网的robots协议我们发现豆瓣网并不拒绝百度爬虫获取它的数据因此我们也可以将爬虫伪装成百度的爬虫将get函数的headers参数修改为headers{User-Agent: BaiduSpider}。 使用 IP 代理
让爬虫程序隐匿自己的身份对编写爬虫程序来说是比较重要的很多网站对爬虫都比较反感的因为爬虫会耗费掉它们很多的网络带宽并制造很多无效的流量。要隐匿身份通常需要使用商业 IP 代理如蘑菇代理、芝麻代理、快代理等让被爬取的网站无法获取爬虫程序来源的真实 IP 地址也就无法简单的通过 IP 地址对爬虫程序进行封禁。
下面以蘑菇代理为例为大家讲解商业 IP 代理的使用方法。首先需要在该网站注册一个账号注册账号后就可以购买相应的套餐来获得商业 IP 代理。作为商业用途建议大家购买不限量套餐这样可以根据实际需要获取足够多的代理 IP 地址作为学习用途可以购买包时套餐或根据自己的需求来决定。蘑菇代理提供了两种接入代理的方式分别是 API 私密代理和 HTTP 隧道代理前者是通过请求蘑菇代理的 API 接口获取代理服务器地址后者是直接使用统一的入口蘑菇代理提供的域名进行接入。 下面我们以HTTP隧道代理为例为大家讲解接入 IP 代理的方式大家也可以直接参考蘑菇代理官网提供的代码来为爬虫设置代理。
import requestsAPP_KEY Wnp******************************XFx
PROXY_HOST secondtransfer.moguproxy.com:9001for page in range(1, 11):resp requests.get(urlfhttps://movie.douban.com/top250?start{(page - 1) * 25},# 需要在HTTP请求头设置代理的身份认证方式headers{Proxy-Authorization: fBasic {APP_KEY},User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36,Accept-Language: zh-CN,zh;q0.8,en-US;q0.6,en;q0.4},# 设置代理服务器proxies{http: fhttp://{PROXY_HOST},https: fhttps://{PROXY_HOST}},verifyFalse)pattern1 re.compile(rspan classtitle([^]*?)/span)titles pattern1.findall(resp.text)pattern2 re.compile(rspan classrating_num.*?(.*?)/span)ranks pattern2.findall(resp.text)for title, rank in zip(titles, ranks):print(title, rank)说明上面的代码需要修改APP_KEY为自己创建的订单对应的Appkey值这个值可以在用户中心用户订单中查看到。蘑菇代理提供了免费的 API 代理和 HTTP 隧道代理试用但是试用的代理接通率不能保证建议大家还是直接购买一个在自己支付能力范围内的代理服务来体验。 简单的总结
Python 语言能做的事情真的很多就网络数据采集这一项而言Python 几乎是一枝独秀的大量的企业和个人都在使用 Python 从网络上获取自己需要的数据这可能也是你将来日常工作的一部分。另外用编写正则表达式的方式从网页中提取内容虽然可行但是写出一个能够满足需求的正则表达式本身也不是件容易的事情这一点对于新手来说尤为明显。在下一节课中我们将会为大家介绍另外两种从页面中提取数据的方法虽然从性能上来讲它们可能不如正则表达式但是却降低了编码的复杂性相信大家会喜欢上它们的。