本文可能篇幅较长,但是绝对干货满满,供应了大量的学习资源和路子。达到让读者独立自主的编写根本网络爬虫的目标,这也是本文的主旨,输出有代价能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直接急速开始吧,本文包含以下内容:
Python环境搭建与根本知识爬虫事理概述爬虫技能概览猫眼电影排行数据抓取Ajax数据爬取猫眼电影票房更多进阶,代理、仿照上岸、APP 爬取等…..Python环境搭建与根本知识
Python环境搭建
Anaconda安装
此处笔者并不会先容Python软件的安装,有读者可能会疑问Python都不安装,我怎么学习前辈的Python知识呢? 不要焦急,此处笔者先容了一种新的Python快速安装办法,即直接安装Anaconda,Anaconda是什么呢?
Anaconda 是一个Python的发行版,包括了Python和很多常见的Python库, 和一个包管理器cond,Anaconda是专注于数据剖析的Python发行版本,包含了conda、Python等720多个科学包及其依赖项,适用于企业级大数据剖析的Python工具。在数据可视化、机器学习、深度学习等多方面都有涉及。不仅可以做数据剖析,乃至可以用在大数据和人工智能领域。有读者可能会疑问这和爬虫有什么关系呢,当然有关系,在编写爬虫程序的过程中须要利用Python库,而Anaconda就已经包含这些常常利用库,这对安装Python库感到头疼的读者再好不过了。当然这统统都是免费的,接下来我们就开始安装美妙的Anaconda吧。
首先从Anaconda官网下载对应版本的Anaconda,如果下载速度过慢推举利用海内的清华大学开源软件镜像站选择对应的Anaconda下载,Anaconda的官网下载页面如下图所示:
本文推举下载Python3.6对应的版本,以笔者为例电脑环境为:Windows-64Bit,下载的对应版本为:Anaconda3-5.2.0-Windows-x86_64,下载完成后打开安装包如下图所示:
点击 next
点击 I Agree
选择 Just Me ,点击 next
选择安装目录,点击next
勾选 Add Anaconda to my PATH environment variable ,然后点击 install 安装即可
IDE环境搭建
IDE笔者推举利用Pycharm,个中免费的社区版已经能够知足我们的需求,利用教程可以参考CSDN博客Pycharm大略利用教程,或者直接在CSDN搜索pycharm教程获取更多知识。此处可以详细先容下
1.1Python 根本技能
我不会先容过于根本内容,由于这些内容互联网上已经大量免费的根本入门教程了,但是笔者会给大家供应一些互联网的免费学习资源和方法,让大家快速学会编写爬虫程序所须要的Python根本知识和进阶知识,而对付根本的爬虫我们须要节制的Python知识有以下:
数据类型列表循环语句判断语句函数Python根本
对付完备没有Python根本的读者,可以学习下面的快速入门
Python3 教程 | 菜鸟教程 Python教程 | 廖雪峰的官方网站Python 教程| 简明教程Python教程™ 笨办法学Python | 看云 The Python Tutorial | Python 3.6.6 documentationPython官方文档,具有绝对的威信和全面,但是文档本身是英文,以是对大部分初学者来说并不是很友好,下面是国人翻译的Python版本,对英文感冒的读者可以选择该版本学习:
Python 入门指南 | python tutorial 3.6.3 documentation 一些入门的书本推举 《Python编程 从入门到实践》《Python根本教程(第3版)》 Python进阶 对付想要提升自己技能的读者,接下的书本和资料该当是很符合你的胃口了 :The Python Standard Library《Python CookBook 3》《流畅的Python》《Python学习手册(第4版)》《Python核心编程(第3版)》《数据构造 Python措辞描述》《Python高性能编程》爬虫是什么
爬虫事理
爬虫是什么?爬虫从实质上说便是在仿照HTTP要求,记住这句话,这便是我们后面常常须要做的事情。一样平常用户获取网络数据的办法有两种:
a. 浏览器提交HTTP要求--->下载网页代码--->解析成页面。
b. 仿照浏览器发送要求(获取网页代码)->提取有用的数据->存放于数据库或文件中。
爬虫便是在做第二种事情,大致过程如下:
i. 通过HTTP库向目标站点发起要求,即发送一个Request,要求可以包含额外的headers等信息,等待做事器的相应
ii. 如果做事器正常相应,会得到一个Response,Response的内容便是所要获取的页面内容,类型可能有HTML、JSON、二进制文件(如图片、视频等类型)。
iii. 得到的内容可能是HTML,可以用正则表达式、网页解析库进行解析。可能是JSON,可以直接转成JOSN工具进行解析,可能是二进制数据,可以保存或者进一步处理
iv. 保存形式多样,可以保存成文本,也可以保存至数据库,或者保存成特定格式的文件。
许多读者可能不知道上面详细在做什么,那么接下来我们通过浏览器抓包剖析上面的过程,笔者推举利用Chrome,对开拓者很友好,后续我们会常常利用到,Chrome下载,如果下载速率较慢,建议利用海内Chrome镜像下载安装。
首先打开浏览器在地址栏输入 https://www.baidu.com/ (读者也可以利用其他网页测试比如咱们的https://gitbook.cn/),回车,百度页面映面而来,然后按下F12,浏览器开拓者选项的快捷键,选择Network栏目,打开界面下图所示:
按下F5刷新页面:
栏目里面更新了大量的数据包,这些包便是浏览器要求的数据,我们想要的数据就在这些要求里面
第一列Name:要求的名称,一样平常会将URL的末了一 部分内容当作名称。第二列Status: 相应的状态码,这里显示为200,代表相应是正常的。通过状态码,我们可 以判断发送了要求之后是否得到了正常的相应。第三列Type: 要求的文档类型。这里为document, 代表我们这次要求的是一个HTML文档,内容便是一些HTML代码。第四列initiator: 要求源。用来标记要求是由哪个工具或进程发起的。第五列Size: 从做事器下载的文件和要求的资源大小。如果是从缓存中取得的资源,则该列会显示from cache。第六列Time:发起要求到获取相应所用的总韶光。第七列Waterfall:网络要求的可视化瀑布流。 接下来我们剖析要求的详细组成,比如点第一个要求即Name为www.baidu.com的要求,如下图所示:我们看到相应等分General部分,要求头、相应头
General一样平常包含以下部分:
Request URL为要求的URLRequest Method为要求的方法Status Code为相应状态码,Remote Address为远程做事器的地址和端口Response Headers一样平常包含以下部分(相应(做事端->客户端[response])):
HTTP/1.1为相应采取的协议和版本号 200 (状态码) OK(描述信息)Location为做事端须要客户端访问的页面路径Server为做事真个Web做事端名Content-Encoding为做事端能够发送压缩编码类型Content-Length为做事端发送的压缩数据的长度Content-Language为做事端发送的措辞类型Content-Type为做事端发送的类型及采取的编码办法Last-Modified为做事端对该资源末了修正的韶光Refresh为做事端哀求客户端1秒钟后,刷新,然后访问指定的页面路径Content-Disposition为做事端哀求客户端以下载文件的办法打开该文件Transfer-Encoding为分块通报数据到客户端 Set-Cookie为做事端发送到客户真个暂存数据Connection为掩护客户端和做事真个连接关系Request Headers 一样平常包含以下部分(要求(客户端->做事端[request])):
GET(要求的办法) /newcoder/hello.html(要求的目标资源) HTTP/1.1(要求采取的协议和版本号) Accept为客户端能吸收的资源类型Accept-Language为客户端吸收的措辞类型Connection为掩护客户端和做事真个连接关系Host: localhost为连接的目标主机和端口号Referer见告做事器我来自于哪里User-Agent为客户端版本号的名字Accept-Encoding为客户端能吸收的压缩数据的类型If-Modified-Since为缓存韶光Cookie为客户端暂存做事真个信息 Date为客户端要求做事真个韶光 而我们须要做的便是仿照浏览器提交Requests Headers获取做事器的相应信息,从而得到我们想要的数据,想要深入理解的读者请访问HTTP | MDN文档理解更多信息。爬虫能抓什么样的数据
在网页中我们能看到各种各样的信息,最常见的便是用户能够看到的网页页面,而通过浏览器的开拓者工具对网页要求进行抓包时我们可以瞥见大量的要求,即有些网页返回的不是HTML代码,可能是json字符串,各种二级制数据,比如图片、音频、视频等,当然还有些是CSS、JavaScript等文件。那么即浏览器能够获取的数据,爬虫程序都能获取到,而浏览器的数据是翻译给用户看到的信息,即只要能够在浏览器访问到的信息,爬虫程序就都能够抓取下来。
爬虫技能概览
^_^:本节先容爬虫常常利用到的技能,比如要求:requests,信息提取:Xpath,Re正则,json,存储:CSV,MySQL, MongoDB,仿照浏览器Selenium,担保在项目实战中涉及的技能读者都会,也便是这里须要讲清楚这些技能的利用方法,
第一个要求
Requests库
Requests库,官方文档是这样描述:Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。警告:非专业利用其他 HTTP 库会导致危险的副浸染,包括:安全毛病症、冗余代码症、重新发明轮子症、啃文档症、烦闷、头疼、乃至去世亡。
Requests 因此 PEP 20 (即著名的Python之禅)的箴言为中央开拓的,下面便是Requests的开拓哲学,望读者能够细细品读,写出更加Pythonic的代码。
Beautiful is better than ugly.(俏丽优于丑陋)
Explicit is better than implicit.(直白优于蕴藉)
Simple is better than complex.(大略优于繁芜)
Complex is better than complicated.(繁芜优于繁琐)
Readability counts.(可读性很主要)
在2.1中我们谈到爬虫的事理便是进行HTTP要求然后得到相应,在相应中提取我们想要的信息并保存。而Requests库便是利用Python仿照HTTP要求的利器。如果读者已经安装了Anaconda,那么Requests库就已经可用了,如果没有Requests库,读者可以在命令行中(win+R 输入 cmd)pip install requests 安装requests库,接下来就开始我们的第一个要求吧!
利用Requests发送HTTP要求非常大略,接下来我们就以GitChat为例:
# 导入requests 模块
import requests
# 发起Get要求并返回Response工具,包含做事器对HTTP要求的相应
response = requests.get('https://gitbook.cn/')
# 打印 相应状态码
print(response.status_code)
# 打印 str类型的相应体,比如一个普通的 HTML 页面,须要对文本进一步剖析时,利用 text
print(response.text)
部分运行的结果如下图所示:
Requests不仅支持Get办法要求,比如Post要求:
# 导入 requests 模块
import requests
# 须要提交的表单数据
data = {
'name': 'ruo', 'age': 22
}
# 发起Post要求
response = requests.post(\"大众http://httpbin.org/post\"大众, data=data)
# 相应体内容
print(response.text)
部分运行的结果如下图所示:
当然Requests还支持更多的要求办法,比如以下要求,笔者就不一一演示了,最常用的要求便是以上Get和Post两种要求办法。
# PUT要求requests.put(“http://httpbin.org/put”) # DELETE要求requests.delete(“http://httpbin.org/delete”)# HEAD要求requests.head(“http://httpbin.org/get”) # OPTIONS要求requests.options(“http://httpbin.org/get”)
由于大多数做事器都会通过要求头中的User-Agent识别客户端利用的操作系统及版本、浏览器及版本等信息,以是爬虫程序也须要加上此信息,以此伪装浏览器;如果不加上很可能别识别出为爬虫,比如当我们不加Headers对知乎进行get要求时:
# 导入 requests 模块
import requests
# 发起Get要求
response = requests.get(\"大众https://www.zhihu.com\公众)
# 状态码
print(response.status_code)
# 相应体内容
print(r.text)
返回的内容如下图所示:
我们可以瞥见返回的400的状态码,及要求无效,接着我们在要求里添加Headers,然后添加User-Agent信息,再次考试测验要求:
# 导入 requests 模块
import requests
# 在Headers中添加User-Agent字段信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
# 发起Get要求
response = requests.get(\"大众https://www.zhihu.com\公众, headers=headers)
# 状态码
print(response.status_code)
# 相应体内容
print(response.text)
返回的内容如下图所示:
可以瞥见要求成功,并返回了精确的相应状态码和相应体。
想要更深入的学习Requests的读者可以访问Requests官方原文文档或者中文文档。
提取信息
当我们通过HTTP要求获取到相应后,加下来就须要提取相应体中的内容,此处笔者先容两种常用的提取方法,一个是正则表达式,另一个是Xpath。
正则表达式
正则表达式是一个很强大的字符串处理工具,险些任何关于字符串的操作都可以利用正则表达式来完成,作为一个爬虫事情者,每天和字符串打交道,正则表达式更是不可或缺的技能。有了它,从HTML里提取想要的信息就非常方便了。
读者可以通过正则表达式 | 廖雪峰的官方网站快速入门,也可以通过Python正则表达式 | 菜鸟教程 学习Python中操作正则和利用正则,Python的官方文档中Python标准库的6.2节也对Re有详细的先容和利用教程。
初次打仗正则表达式的读者可能会以为有些抽象,有点难入门,由于毕竟正则表达式本身便是一种小型的、高度专业化的编程措辞,以上的入门教程理解后,这里给读者先容一个提取信息通用的正则字符串 .?,该规则能够以非贪婪的办法匹配任意字符,后面我们会常常利用到。
比如我们须要匹配 <H1>Chapter 1 - 先容正则表达式</H1> 标签中的内容,我们可以:
# 导入 re 模块
import re
# 待匹配文本
h1 = '<H1>Chapter 3.2.1 - 先容正则表达式</H1>'
# 将正则字符串编译成正则表达式工具,方便在后面的匹配中复用
pat = re.compile('<H1>(.?)</H1>', re.S)
# re.search 扫描全体字符串并返回第一个成功的匹配
result = re.search(pat, h1)
# 匹配的全体表达式的字符串,group() 可以一次输入多个组号,在这种情形下它将返回一个包含那些组所对应值的元组。
print(result.group(0))
# 匹配的第一个括号内的字符串,group() 可以一次输入多个组号,在这种情形下它将返回一个包含那些组所对应值的元组。
print(result.group(1))
以下是匹配结果:
Xpath
XPath即为XML路径措辞(XML Path Language),它是一种用来确定XML文档中某部分位置的措辞。
XPath基于XML的树状构造,供应在数据构造树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开拓者采取来当作小型查询措辞,在爬虫中提取信息也是不错的好帮手。
读者可以通过 Xpath 教程 | 菜鸟教程 学习Xpath的事理及编写方法,也可以访问CSDN博客中搜索Python Xpath学习更多Python中Xpath的基本操作,接下来先容编写“编写”的技巧和在Python中利用的方法,之以是加上“编写”,读者看下面便知。
还记得在2.1爬虫事理中利用的浏览器的开拓者工具吗,我们可以通过这个工具直接获取对应节点的Xpath规则,从而达到快速利用Xpath提取网页信息的目的,例如提取猫眼电影TOP100榜中的电影信息,首先打开浏览器输入http://maoyan.com/board/4,将鼠标移动到须要提取的信息(电影名称)上,右键选择检讨,如下图所示:
接着我们选择下面的元素,右键选择Copy-->xpath, 如下图所示:
获取了该节点的xpath规则了,接下来我们编写Python程序验证该规则是否能够真正提取电影名:
import requests
# 导入lxml库的etree模块
from lxml import etree
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
url = 'http://maoyan.com/board/4'
response = requests.get(url, headers=headers)
html = response.text
# 调用HTML类进行初始化
html = etree.HTML(html)
# 粘贴我们copy的xpath,提取电影名 “霸王别姬”
result_bawangbieji = html.xpath('//[@id=\"大众app\公众]/div/div/div[1]/dl/dd[1]/div/div/div[1]/p[1]/a')
# 打印节点标签包含的文本内容
print(result_bawangbieji[0].text)
# 提取该页面所有电影名,即选择所有'dd'标签的电影名
result_all = html.xpath('//[@id=\"大众app\公众]/div/div/div[1]/dl/dd/div/div/div[1]/p[1]/a')
# 打印所有提取出的电影名
print('该页面全部电影名:')
for one in result_all:
print(one.text)
结果如下图所示,我们成功提取了HTML中电影名的信息:
存储信息
TEXT 文本存储
如果读者学习了Python的根本知识,那么该当比较熟习这种基本信息存储办法,即直接将我们须要存储的信息写入文件中,比如常见的TEXT文件,如果不熟习的读者可以通过Python文件读写 - Python教程™快速概览,下面我们就对3.2.2中Xpath提取的电影名进行文件存储操作:
import requests
from lxml import etree
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
url = 'http://maoyan.com/board/4'
response = requests.get(url, headers=headers)
html = response.text
# 调用HTML类进行初始化
html = etree.HTML(html)
# 粘贴我们copy的xpath,提取电影名 “霸王别姬”
result_bawangbieji = html.xpath('//[@id=\"大众app\"大众]/div/div/div[1]/dl/dd[1]/div/div/div[1]/p[1]/a')
# 打印节点标签包含的文本内容
print(result_bawangbieji[0].text)
# 提取该页面所有电影名
result_all = html.xpath('//[@id=\"大众app\"大众]/div/div/div[1]/dl/dd/div/div/div[1]/p[1]/a')
# 打印所有提取出的电影名
print('该页面全部电影名:')
for one in result_all:
print(one.text)
# 将这一页电影名存储至TEXT文件中,'a' 指打开一个文件进行追加。 如果文件存在,则文件指针位于文件末端。也便是说,文件处于追加模式。如果文件不存在,它将创建一个新文件进行写入。
with open('film_name.text', 'a') as f:
for one in result_all:
f.write(one + '\n')
存储结果如下图所示:
CSV存储
CSV文件即逗号分隔值(也称字符分隔值,由于分隔符可以不是逗号),是一种常用的文本格式,以纯文本形式存储表格数据,包括数字或者字符。Python中已经内置CSV文件操作的模块,只须要导入就可以进行CSV存储操作,下面我们就将3.2.2中Xpath提取的电影名进行CSV文件存储操作:
import requests
from lxml import etree
# 导入CSV模块
import csv
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
url = 'http://maoyan.com/board/4'
response = requests.get(url, headers=headers)
html = response.text
html = etree.HTML(html)
result_bawangbieji = html.xpath('//[@id=\"大众app\"大众]/div/div/div[1]/dl/dd[1]/div/div/div[1]/p[1]/a')
print(result_bawangbieji[0].text)
result_all = html.xpath('//[@id=\"大众app\"大众]/div/div/div[1]/dl/dd/div/div/div[1]/p[1]/a')
print('该页面全部电影名:')
for one in result_all:
print(one.text)
# 将这一页电影名存储至CSV文件中:
with open('film_name.csv', 'a', newline='') as f:
csv_file = csv.writer(f)
for one in result_all:
csv_file.writerow([one.text])
CSV文件存储结果如下图所示:
MySQL 存储
MySQL 是最盛行的关系型数据库管理系统,如果读者没有安装MySQL可以通过phpstudy 2018 下载下载phpstudy快速安装MySQL
在Python2中,连接MySQL的库大多是利用MySQLdb,但是此库的官方并不支持Python3,以是这里推举利用的库是PyMySQL,读者可以通过Python+MySQL数据库操作(PyMySQL)| Python教程™学习PyMYSQL操作MySQL的干系方法和实例,接下来我们就考试测验将3.2.2中Xpath提取的电影名存储到MySQL中,没有该模块的读者可以通过(win+R 输入 cmd)pip install pymysql 安装pymysql库。
import requests
from lxml import etree
# 导入pymysql模块
import pymysql
# 打开一个数据库连接
db = pymysql.connect(host='localhost', user='root', password='root', port=3306, db='spider', use_unicode=True, charset=\"大众utf8\"大众)
# 获取MySQL的操作游标,利用游标来实行SQL语句
cursor = db.cursor()
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
url = 'http://maoyan.com/board/4'
response = requests.get(url, headers=headers)
html = response.text
html = etree.HTML(html)
result_bawangbieji = html.xpath('//[@id=\"大众app\"大众]/div/div/div[1]/dl/dd[1]/div/div/div[1]/p[1]/a')
print(result_bawangbieji[0].text)
result_all = html.xpath('//[@id=\"大众app\"大众]/div/div/div[1]/dl/dd/div/div/div[1]/p[1]/a')
print('该页面全部电影名:')
for one in result_all:
print(one.text)
try:
# 插入数据语句
sql = 'INSERT INTO film_infor(film_name) values (%s)'
cursor.execute(sql, (one.text))
db.commit()
except:
db.rollback()
MySQL存储结果如下图所示: