admin 管理员组文章数量: 887044
爬虫教程:https://piaosanlang.gitbooks.io/spiders/content/
如何入门 Python 爬虫:https://zhuanlan.zhihu/p/21479334
静觅 崔庆才的个人博客 Python 爬虫系列:http://cuiqingcai/category/technique/python
http://wwwblogs/miqi1992/category/1105419.html
Python 爬虫从入门到放弃系列博客:https://wwwblogs/zhaof/tag/爬虫/default.html?page=2
Python 爬取功能汇总:https://www.jb51/Special/985.htm
Python 3.8.5 文档
官方文档:https://docs.python/zh-cn/3/
1. 爬虫入门 初级篇
IDE 选择: PyCharm (推荐) 、SublimeText3、Visual Studio
Python 版本:Python3。( 最简单的是直接安装 Anaconda,使用 Anaconda 管理虚拟环境 )
- Windows 平台:https://docs.python/zh-cn/3/using/windows.html
- Linux Ubuntu 平台:https://docs.python/zh-cn/3/using/unix.html
1.1 为什么要学习爬虫
学习需求:抓取的某个网站或者某个应用的内容,提取有用的价值
实现手段:模拟用户在浏览器或者应用(app)上的操作,实现自动化的程序爬虫应用场景(利用爬虫能做什么?)
大家最熟悉的应用场景:抢票神器(360抢票器)、投票神器(微信朋友圈投票)
企业应用场景
- 拉勾网招聘职位数据分析报告
- 2016年中国外卖O2O行业发展报告
-
2016年中国在线出境游市场研究报告
1、各种热门公司招聘中的职位数及月薪分布
2、对某个 App 的下载量跟踪
3、 饮食地图
4、 票房预测
1.2 爬虫是什么 ?
专业术语: 网络爬虫(又被称为网页蜘蛛,网络机器人)是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。
爬虫起源(产生背景):随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战;搜索引擎有Yahoo,Google,百度等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。网络爬虫是搜索引擎系统中十分重要的组成部分,它负责从互联网中搜集网页,采集信息,这些网页信息用于建立索引从而为搜索 引擎提供支持,它决定着整个引擎系统的内容是否丰富,信息是否即时,因此其性能的优劣直接影响着搜索引擎的效果。
网络爬虫程序的优劣,很大程度上反映了一个搜索引擎的好差。不信,你可以随便拿一个网站去查询一下各家搜索对它的网页收录情况,爬虫强大程度跟搜索引擎好坏基本成正比。
搜索引擎工作原理
- 第一步:抓取网页(爬虫)。搜索引擎是通过一种特定规律的软件跟踪网页的链接,从一个链接爬到另外一个链接,像蜘蛛在蜘蛛网上爬行一样,所以被称为“蜘蛛”也被称为“机器人”。搜索引擎蜘蛛的爬行是被输入了一定的规则的,它需要遵从一些命令或文件的内容。 Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
robots.txt 示例: https://www.taobao/robots.txt http://www.qq/robots.txt
示例:CSDN robot.txt ( https://blog.csdn/robots.txt ) 文件中 Sitemap:# -*- coding: UTF-8 -*- import re import requests def download(url, retry_count=3): html = None for retry in range(retry_count): print(f'Downloading : {url}') custom_headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36' } try: r = requests.get(url, headers=custom_headers, verify=False) if r.status_code == 200: print('status_code : {0}'.format(r.status_code)) html = r.text # html = r.content else: print('status_code : {0}'.format(r.status_code)) break except BaseException as ex: print(f'Download error : {ex}') return html if __name__ == "__main__": temp_url = r'https://blog.csdn/s/sitemap/pcsitemapindex.xml' sitemap = download(temp_url) links = re.findall(r'<loc>(.*?)</loc>', sitemap) for link in links: print(link) pass
- 第二步:数据存储。搜索引擎是通过蜘蛛跟踪链接爬行到网页,并将爬行的数据存入原始页面数据库。其中的页面数据与用户浏览器得到的 HTML 是完全一样的。搜索引擎蜘蛛在抓取页面时,也做一定的重复内容检测,一旦遇到权重很低的网站上有大量抄袭、采集或者复制的内容,很可能就不再爬行。
- 第三步:预处理。搜索引擎将蜘蛛抓取回来的页面,进行各种步骤的预处理。 ⒈提取文字, ⒉中文分词, ⒊去停止词, ⒋消除噪音(搜索引擎需要识别并消除这些噪声,比如版权声明文字、导航条、广告等……), 5 正向索引, 6 倒排索引, 7 链接关系计算, 8 特殊文件处理等。 除了HTML文件外,搜索引擎通常还能抓取和索引以文字为基础的多种文件类型,如 PDF、Word、WPS、XLS、PPT、TXT 文件等。我们在搜索结果中也经常会看到这些文件类型。但搜索引擎还不能处理图片、视频、Flash 这类非文字内容,也不能执行脚本和程序。
- 第四步:排名,提供检索服务
但是,这些通用性搜索引擎也存在着一定的局限性,如:
- (1) 不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。
- (2) 通用搜索引目标是尽可能的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。
- (3) 万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。
- (4) 通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。
为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。 聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。
与通用爬虫(general purpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。
聚焦爬虫工作原理以及关键技术概述:
网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。聚焦爬虫的工作流程较为复杂,需要根据一定的网页分析算法过滤与主题无关的链接,保留有用的链接并将其放入等待抓取的URL队列。然后,它将根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。另外,所有被爬虫抓取的网页将会被系统存贮,进行一定的分析、过滤,并建立索引,以便之后的查询和检索;对于聚焦爬虫来说,这一过程所得到的分析结果还可能对以后的抓取过程给出反馈和指导。
相对于通用网络爬虫,聚焦爬虫还需要解决三个主要问题:
- (1) 对抓取目标的描述或定义;
- (2) 对网页或数据的分析与过滤;
- (3) 对URL的搜索策略。
抓取目标的描述和定义是决定网页分析算法与URL搜索策略如何制订的基础。而网页分析算法和候选URL排序算法是决定搜索引擎所提供的服务形式和爬虫网页抓取行为的关键所在。这两个部分的算法又是紧密相关的。
网络爬虫的发展趋势
随着 AJAX/Web2.0 的流行,如何抓取 AJAX 等动态页面成了搜索引擎急需解决的问题,如果搜索引擎依旧采用“爬”的机制,是无法抓取到 AJAX 页面的有效数据的。 对于 AJAX 这样的技术,所需要的爬虫引擎必须是基于驱动的。而如果想要实现事件驱动,首先需要解决以下问题:
- 第一:JavaScript 的交互分析和解释;
- 第二:DOM 事件的处理和解释分发;
- 第三:动态 DOM 内容语义的抽取。
爬虫发展的几个阶段(博士论文copy)
- 第一个阶段:可以说是 早期爬虫,斯坦福的几位同学完成的抓取,当时的互联网基本都是完全开放的,人类流量是主流;
- 第二个阶段:是 分布式爬虫,但是爬虫面对新的问题是数据量越来越大,传统爬虫已经解决不了把数据都抓全的问题,需要更多的爬虫,于是调度问题就出现了;
- 第三阶段:是 Deep Web 爬虫。此时面对新的问题是数据之间的link越来越少,比如淘宝,点评这类数据,彼此link很少,那么抓全这些数据就很难;还有一些数据是需要提交查询词才能获取,比如机票查询,那么需要寻找一些手段“发现”更多,更完整的不是明面上的数据。
- 第四阶段:智能爬虫,这主要是爬虫又开始面对新的问题:社交网络数据的抓取。
社交网络对爬虫带来的新的挑战包括
- 有一条账号护城河。我们通常称UGC(User Generated Content)指用户原创内容。为 web2.0,即数据从单向传达,到双向互动,人民群众可以与网站产生交互,因此产生了账号,每个人都通过账号来标识身份,提交数据,这样一来社交网络就可以通过封账号来提高数据抓取的难度,通过账号来发现非人类流量。之前没有账号只能通过cookie和ip。cookie又是易变,易挥发的,很难长期标识一个用户。
- 网络走向封闭。新浪微博在 2012 年以前都是基本不封的,随便写一个程序怎么抓都不封,但是很快,越来越多的站点都开始防止竞争对手,防止爬虫来抓取,数据逐渐走向封闭,越来越多的人难以获得数据。甚至都出现了专业的爬虫公司,这在2010年以前是不可想象的。。
- 反爬手段,封杀手法千差万别。写一个通用的框架抓取成百上千万的网站已经成为历史,或者说已经是一个技术相对成熟的工作,也就是已经有相对成熟的框架来”盗“成百上千的墓,但是极个别的墓则需要特殊手段了,目前市场上比较难以抓取的数据包括,微信公共账号,微博,facebook,ins,淘宝等等。具体原因各异,但基本无法用一个统一框架来完成,太特殊了。如果有一个通用的框架能解决我说的这几个网站的抓取,这一定是一个非常震撼的产品,如果有,一定要告诉我,那我公开出来,然后就改行了。
当面对以上三个挑战的时候,就需要智能爬虫。智能爬虫是让爬虫的行为尽可能模仿人类行为,让反爬策略失效,只有”混在老百姓队伍里面,才是安全的“,因此这就需要琢磨浏览器了,很多人把爬虫写在了浏览器插件里面,把爬虫写在了手机里面,写在了路由器里面(春节抢票王)。再有一个传统的爬虫都是只有读操作的,没有写操作,这个很容易被判是爬虫,智能的爬虫需要有一些自动化交互的行为,这都是一些抵御反爬策略的方法。
1.3 爬虫基本原理
爬虫是模拟用户在浏览器或者某个应用上的操作,把操作的过程、实现自动化的程序,当我们在浏览器中输入一个 url 后回车,后台会发生什么?比如说你输入http://www.sina/,简单来说这段过程发生了以下四个步骤:
- 1. 查找域名对应的IP地址。
- 2. 向IP对应的服务器发送请求。
- 3. 服务器响应请求,发回网页内容。
- 4. 浏览器解析网页内容。
网络爬虫本质:本质就是浏览器http请求。浏览器和网络爬虫是两种不同的网络客户端,都以相同的方式来获取网页。
网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据, 而不需要一步步人工去操纵浏览器获取。
浏览器是如何发送和接收这个数据呢?
- HTTP 简介:HTTP协议(HyperText Transfer Protocol,超文本传输协议)目的是为了提供一种发布和接收HTML(HyperText Markup Language)页面的方法。
- HTTP 协议所在的协议层(了解):HTTP 是基于TCP协议之上的。在 TCP/IP 协议参考模型的各层对应的协议如下图,其中HTTP是应用层的协议。 默认HTTP的端口号为80,HTTPS的端口号为443。
网络模型图
HTTP 工作过程
一次 HTTP 操作称为一个事务,其工作整个过程如下:
- 1 ) 、地址解析。如用客户端浏览器请求这个页面:http://localhost:8080/index.htm从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下: 协议名:http 主机名:localhost 端口:8080 对象路径:/index.htm在这一步,需要域名系统DNS解析域名localhost,得主机的IP地址。
- 2)、封装 HTTP 请求数据包。把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
- 3)封装成 TCP 包,建立TCP连接(TCP的三次握手)。在HTTP工作开始之前,客户机(Web浏览器)首先要通过网络与服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。这里是8080端口
- 4)客户机发送请求命令。建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。
- 5)服务器响应。服务器接到请求后给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是 MIME 信息包括服务器信息、实体信息和可能的内容。实体消息:服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据
- 6)服务器关闭 TCP 连接。一般情况下,一旦 Web 服务器向浏览器发送了请求数据,它就要关闭 TCP 连接,然后如果浏览器或者服务器在其头信息加入了这行代码 Connection:keep-alive 。TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
HTTP 协议栈数据流
HTTPS。HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。其所用的端口号是443。
SSL:安全套接层,是netscape公司设计的主要用于web的安全传输协议。这种协议在WEB上获得了广泛的应用。通过证书认证来确保客户端和网站服务器之间的通信数据是加密安全的。
有两种基本的加解密算法类型:
- 1)对称加密(symmetrcic encryption):密钥只有一个,加密解密为同一个密码,且加解密速度快,典型的对称加密算法有DES、AES,RC5,3DES等;对称加密主要问题是共享秘钥,除你的计算机(客户端)知道另外一台计算机(服务器)的私钥秘钥,否则无法对通信流进行加密解密。解决这个问题的方案非对称秘钥。
- 2)非对称加密:使用两个秘钥:公共秘钥和私有秘钥。私有秘钥由一方密码保存(一般是服务器保存),另一方任何人都可以获得公共秘钥。这种密钥成对出现(且根据公钥无法推知私钥,根据私钥也无法推知公钥),加密解密使用不同密钥(公钥加密需要私钥解密,私钥加密需要公钥解密),相对对称加密速度较慢,典型的非对称加密算法有RSA、DSA等。
https 通信的优点:
客户端产生的密钥只有客户端和服务器端能得到;
加密的数据只有客户端和服务器端才能得到明文;
客户端到服务端的通信是安全的。
1.4 爬虫工作流程
网络爬虫的基本工作流程如下:
- 1. 首先选取一部分精心挑选的种子 URL;
- 2. 将这些 URL 放入待抓取 URL 队列;
- 3. 从待抓取 URL 队列中取出待抓取在 URL,解析 DNS,并且得到主机的 ip,将 URL 对应的网页下载下来并存储到已下载网页库中。此外,将这些 URL 放进已抓取 URL 队列。
- 4. 分析已抓取 URL 队列中的 URL,分析其中的其他 URL,并且将 URL 放入待抓取 URL 队列,从而进入下一个循环。
校花网 爬取 示例:爬取 大学校花( http://www.521609/daxuexiaohua/ )
这个爬虫只是爬取一个 URL,并没有提取更多 URL 进行爬取
# -*- coding:utf-8 -*-
import os
import chardet
import requests
from bs4 import BeautifulSoup
def spider():
url = "http://www.521609/daxuexiaohua/"
proxies = {
"http": "http://172.17.18.80:8080",
"https": "https://172.17.18.80:8080"
}
r = requests.get(
url,
# proxies=proxies
)
html = r.content.decode("gbk")
soup = BeautifulSoup(html, "lxml")
divs = soup.find_all("div", class_="index_img list_center")
print(f'len(divs) : {len(divs)}')
for div in divs:
tag_ul = div.find('ul')
tag_all_li = tag_ul.find_all('li')
print(f'len(tag_all_li): {len(tag_all_li)}')
for tag_li in tag_all_li:
tag_img = tag_li.find('img')
print(f'mm_name: {tag_img["alt"]}')
print(f'\t\t mm_pic: http://www.521609{tag_img["src"]}')
home_page = tag_li.find('a')
print(f'\t\t home_page: http://www.521609{home_page["href"]}')
# print(soup)
if __name__ == "__main__":
spider()
# input('press any key to continue......')
# pass
1.5 HTTP 代理神器 Fidder
Fiddler 不但能截获各种浏览器发出的HTTP请求, 也可以截获各种智能手机发出的 HTTP/HTTPS请求。 Fiddler 能捕获 IOS 设备发出的请求,比如 IPhone, IPad, MacBook. 等等苹果的设备。 同理,也可以截获 Andriod,Windows Phone 的等设备发出的HTTP/HTTPS。工作原理:Fiddler 是以代理 web 服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888。
Fiddler 抓取 HTTPS 设置:启动 Fiddler,打开菜单栏中的 Tools > Fiddler Options,打开 “Fiddler Options” 对话框。
选中 Capture HTTPS CONNECTs,再选中下方 Ignore server certificate errors,
然后再点击 Actions 安装证书( 要抓取 HTTPS 的流量,必须安装证书 ),安装为 "根证书"。。。
配置 Fiddler 允许远程连接( 可以抓取手机流量 ):
Connections 页签,选中 Allow remote computers to connect。重启 Fidler(这一步很重要,必须做)。
Fiddler 如何捕获 Chrome的会话:switchyomega 安装插件
百度( 百度的时候把点去掉 ):i点sha点dow点socks 或者 lan点tern
打开网址 chrome 网上应用商店,然后搜索 "switchyomega"。
Fiddler 如何捕获 Firefox 的会话
能支持 HTTP 代理的任意程序的数据包都能被 Fiddler 嗅探到,Fiddler 的运行机制其实就是本机上监听 8888 端口的 HTTP代理。 Fiddler2启动的时候默认IE的代理设为了127.0.0.1:8888,而其他浏览器是需要手动设置的,所以将Firefox的代理改为127.0.0.1:8888就可以监听数据了。 Firefox 上通过如下步骤设置代理 点击: Tools -> Options, 在Options 对话框上点击Advanced tab - > network tab -> setting.
Fiddler 的基本界面
特别注意: 遇到这个 Click 请点击 Click
Fiddler 强大的 Script 系统
Fiddler 包含了一个强大的基于事件脚本的子系统,并且能使用 语言进行扩展。
官方的帮助文档: http://www.fiddler2/Fiddler/dev/ScriptSamples.asp
Fiddler 的 Fiddler Script 标签,如下图:
在里面我们就可以编写脚本了, 看个实例让所有 cnblogs 的会话都显示红色。 把这段脚本放在 OnBeforeRequest(oSession: Session) 方法下,并且点击 "Save script"
if (oSession.HostnameIs("wwwblogs")) {
oSession["ui-color"] = "red";
}
这样所有的cnblogs的会话都会显示红色。
1.6 HTTP 协议介绍
HTTP (HyperText Transfer Protocol) 提供了一种发布和接收HTML(HyperText Markup Language)页面的方法。
Http 两部分组成:请求、响应。
客户端请求消息:客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。
服务器响应消息:HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行 和 响应正文。
cookies 和 session
服务器 和 客户端 的交互仅限于请求/响应过程,结束之后便断开, 在下一次请求服务器会认为新的客户端。为了维护他们之间的链接,让服务器知道这是前一个用户发送的请求,必须在一个地方保存客户端的信息:
- Cookie 通过在客户端记录信息确定用户身份。
- Session 通过在服务器端记录信息确定用户身份。
HTTP 请求
请求方法
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP 1.0 定义了三种请求方法: GET,POST 和 HEAD方法。
HTTP 1.1 新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE 和 CONNECT 方法。
序号 |
方法 |
描述 |
1 |
GET |
请求指定的页面信息,并返回实体主体。 |
2 |
HEAD |
类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 |
POST |
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。 POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 |
PUT |
从客户端向服务器传送的数据取代指定的文档的内容。 |
5 |
DELETE |
请求服务器删除指定的页面。 |
6 |
CONNECT |
HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 |
OPTIONS |
允许客户端查看服务器的性能。 |
8 |
TRACE |
回显服务器收到的请求,主要用于测试或诊断。 |
GET和POST方法区别归纳如下几点:
- 1. GET 是从服务器上获取数据,POST 是向服务器传送数据。
- 2. GET 请求的时候,参数都显示在浏览器网址上。POST 请求的时候,参数在请求体当中,消息长度没有限制而且以隐式的方式进行发送
- 3. 尽量避免使用 Get 方式提交表单,因为有可能会导致安全问题。 比如说在登陆表单中用 Get 方式,用户输入的用户名和密码将在地址栏中暴露无遗。 但是在分页程序中用 Get 方式就比用 Post 好。
URL概述
统一资源定位符(URL,英语 Uniform / Universal Resource Locator的缩写)是用于完整地描述 Internet 上网页和其他资源的地址的一种标识方法。
URL 格式:基本格式如下 schema://host[:port#]/path/…/[?query-string][#anchor]
- 1. schema 协议 (例如:http, https, ftp)
- 2. host 服务器的IP地址或者域名
- 3. port# 服务器的端口(如果是走协议默认端口,缺省端口80)
- 4. path 访问资源的路径
- 5. query-string 参数,发送给http服务器的数据
- 6. anchor- 锚(跳转到网页的指定锚点位置)
版权声明:本文标题:爬虫教程( 1 ) --- 初级、基础、实践 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1725920532h892929.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论