Python爬虫自学笔记(一)爬虫基础知识
浏览器工作原理
我们在浏览器的地址栏输入网址(URL,全称为Uniform Resource Locator,统一资源定位器)。
然后,浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做【请求】。
紧接着,服务器把你想要的网站数据发送给浏览器,这个过程叫做【响应】。
当服务器把数据响应给浏览器之后,浏览器并不会直接把数据丢给你。因为这些数据是用计算机的语言写的,浏览器还要把这些数据翻译成你能看得懂的样子,这是浏览器做的另一项工作【解析数据】。
紧接着,我们就可以在拿到的数据中,挑选出对我们有用的数据,这是【提取数据】。
最后,我们把这些有用的数据保存好,这是【存储数据】。
爬虫工作原理
其中,爬虫可以帮我们代劳这个过程的其中几步:
当你决定去访问某个网页后,
首先,爬虫可以模拟浏览器去向服务器发出请求;
其次,等服务器响应后,爬虫程序还可以代替浏览器帮我们解析数据;
接着,爬虫可以根据我们设定的规则批量提取相关数据,而不需要我们去手动提取;
最后,爬虫可以批量地把数据存储到本地。
这就是爬虫做的事。简化上图,就是爬虫的工作原理了:
所以总结一下,爬虫的工作步骤有以下四步:
第1步:获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。
第2步:解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。
第3步:提取数据。爬虫程序再从中提取出我们需要的数据。
第4步:储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。
无论爬虫程序写得多么复杂,万变不离其宗,爬虫的基本工作原理和步骤就是这些。
HTML基础知识
HTML是用来描述网页的一种语言,英文全称是Hyper Text Markup Language,也叫超文本标记语言。
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> 人生苦短,我用Python </body> </html>
我们用上面这个最基本的网页,分析一下HTML的基本结构如下:
HTML
文档主要由元素组成。
第一行<!DOCTYPE html>
是一个全局声明,目的是告诉浏览器,你现在处理的这个文档是HTML
文档。
声明过后,下面是HTML代码的主体部分,一共有三组基本元素,分别是html元素(<html></html>
),head头元素(<head></head>
),和body主体元素(<body></body>
)。
它们成对出现,都带有尖括号(<>
&</>
),分别代表着元素的起点和终点。
最外层是<html>
(文档起点)</html>
(文档终点),它的作用是标记文档的起始位置和终止位置,从层级上来看,显然是最高层级,将<head></head>
(头部)和<body></body>
(主题)包裹了起来。
当然HTML文档可以容纳更加丰富的信息,比如加颜色、居中等等,还可以加图片、音乐、链接等
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Python爬虫自学笔记</title> </head> <body> <div style="color:blue;text-align:center;margin-top:80px;">人生苦短,我用Python</div> </body> </html>
头部元素(<head></head>
)内,一般会被用来设置网页的编码,添加网页标签的小logo,小标题,外部文件引用等。
HTML文档的主体元素(<body></body>
)负责定义网页窗口内的所有内容,概况起来主要就是两类:标签和属性
标签
标签用于标记文本信息,指用尖括号(<>
和</>
)括起来的字母和英文,形式有两种:闭合标签和空标签。
闭合标签,它们绝大多数成对出现(有开始标签<>
,也有结束标签</>
),如:<title>和</title>
是标题标签,<div>和</div>
是块标签,<form>和</form>
是表单标签。
空标签,顾名思义,指那些“孤苦伶仃”的单标签,它们“形影单只”只有一个尖括号<>
(斜杠/
可省略),标签开始即结束,比如上面的<img />
是图片标签,<link />
是链接标签,<input />
是input标签。
值得注意的是,不要把标签与我们前文讲的元素混淆了,前面我们说的元素,其实是包含了开始标签与结束标签内的所有代码。如html元素是指<html></html>
包括标签内的所有代码。
通过标签的英文名,我们大致能猜测出它的作用:给浏览器介绍文本的结构。
<img/>
是放图片的,<form></form>
是放表单的。
属性
刻画元素的大小、颜色等等信息的就是属性。
width属性可以描述宽度,height属性能控制高度,还有src属性设置链接等等。
属性可以集中书写,放在head元素的<style>标签内, 然后各个元素去套用
<style> h1 { font-weight: bold;/*控制元素字体粗细*/ text-align: center;/*控制元素对齐方式*/ letter-spacing: 2px;/*控制文本字符的间距*/ color: #20b2aa;/*控制元素的颜色*/ } </style>
但为了解决个性化问题,HTML
文档诞生了两个最为特殊的元素:class
和id
。
属性:class&id
class
属性值相同的元素可复用同一套样式。
id
属性则刚好和class
属性相反,整个HTML文档,它是独一无二的标识,每个id
值只能定义一个元素。如果要爬取的元素带有id
属性,那么恭喜,这个元素具有唯一的标识,有了id
,从千万元素中取值,犹如探囊取物。
注:在<style>
标签中定义class属性的样式用点.
,id属性用井号键#
Python爬虫的基本思路
网页分为静态网页和动态网页
打开网页查看源代码,我们能够找到network工具,通过network工具,我们查看我们所需要的信息在哪里。network主要可以看到以下内容
Network
能够记录浏览器的所有请求。我们最常用的是:ALL(查看全部)/XHR(仅查看XHR)/Doc(Document,第0个请求一般在这里),有时候也会看看:Img(仅查看图片)/Media(仅查看媒体文件)/Other(其他)。最后,JS和CSS,则是前端代码,负责发起请求和页面实现;Font是文字的字体;而理解WS和Manifest,需要网络编程的知识,倘若不是专门从事这个行业,你不需要了解。
一般来说,刷新网页,如果XHR没有内容刷新的,就是静态网页,如果XHR有刷新的就是动态网页,对两种网页用不同的方式爬取。
静态网页爬取
当数据藏匿于网页源代码,我们自有一条完整的“爬虫四步”链,在这里,最重要的库叫BeautifulSoup,它能提供一套完整的数据解析、数据提取解决方案。用法如下:
主要用到的库:requests、BeautifulSoup(BS4)
动态网页爬取
当数据在XHR
中现身。
XHR
所传输的数据,最重要的一种是用json
格式写成的,和html
一样,这种数据能够有组织地存储大量内容。json
的数据类型是“文本”,在Python语言当中,我们把它称为字符串。我们能够非常轻易地将json
格式的数据转化为列表/字典,也能将字典/列表转为json
格式的数据。
然后就是从字典和列表中提取我们所需要的数据了。总结一下动态网页爬取流程:
更复杂的请求
最初requests.get()
里面其实只有一个参数,即url,
但其实,这个请求可以有多个参数。
params
,可以让我们带着参数来请求数据:我想要第几页?我想要搜索的关键词?我想要多少个数据?
headers
,请求头。它告诉服务器,我的设备/浏览器是什么?我从哪个页面而来?
再往后,除了get
请求之外,还存在着另一种请求方式——post
。
post
区别于get
的是:get
是明文显示参数,post
是非明文显示参数。
学会post
,你又有两个参数可用:
在post
请求里,我们使用data
来传递参数,其用法和params
非常相像。
cookies
,它的作用是让服务器“记住你”,比如一般当你登录一个网站,你都会在登录页面看到一个可勾选的选项“记住我”。如果你点了勾选,服务器就会生成一个cookies和你的账号绑定。接着,它把这个cookies告诉你的浏览器,让浏览器把cookies存储到你的本地电脑。当下一次,浏览器带着cookies访问博客,服务器会知道你是何人,你不需要再重复输入账号密码,就能直接访问。
存储
存储数据的方法有许多,其中最常见的是:csv
和excel
。当然也有txt和docx。
#csv写入的代码: import csv csv_file=open('demo.csv','w',newline='') writer = csv.writer(csv_file) writer.writerow(['电影','豆瓣评分']) csv_file.close() #csv读取的代码: import csv csv_file=open('demo.csv','r',newline='') reader=csv.reader(csv_file) for row in reader: print(row) #Excel写入的代码: import openpyxl wb=openpyxl.Workbook() sheet=wb.active sheet.title='new title' sheet['A1'] = '漫威宇宙' rows= [['美国队长','钢铁侠','蜘蛛侠','雷神'],['是','漫威','宇宙', '经典','人物']] for i in rows: sheet.append(i) print(rows) wb.save('Marvel.xlsx') #Excel读取的代码: import openpyxl wb = openpyxl.load_workbook('Marvel.xlsx') sheet=wb['new title'] sheetname = wb.sheetnames print(sheetname) A1_value=sheet['A1'].value print(A1_value) #txt写入的代码: wb=open('marvel.txt','a',encoding='utf-8') title='漫威宇宙' rows=['美国队长','钢铁侠','蜘蛛侠','雷神'],['是','漫威','宇宙', '经典','人物']] wb.write(title) wb.writelines(rows) wb.close() #txt读取的代码: wb=open('marvel.txt','r',encoding='utf-8') wenben=wb.read() print(wenben) #docx写入的代码: import docx from docx.shared import Inches,Pt,Cm from docx.enum.text import WD_PARAGRAPH_ALIGNMENT title = '漫威宇宙' content= '美国队长、钢铁侠、蜘蛛侠、雷神等都是漫威宇宙经典人物' doc=docx.Document() doc.add_heading(title,level=0) p=doc.add_paragraph() p.paragraph_format.first_line_indent = Inches(0.3) text = p.add_run(content) text.style.font.size = Pt(15) text.style.font.name = 'Times New Roman' doc.add_page_break() doc.save('marvel.docx') #docx读取的代码: import docx doc=docx.Document('marvel.docx') title=doc.title print(title.text) paragraphs = doc.paragraphs for paragraph in paragraphs: print(paragraph.text +"\n")
协程
如果要爬取的数据特别特别多,以至于程序会被拖得很慢怎么办?用协程。
多协程,是一种非抢占式的异步方式。使用多协程的话,就能让多个爬取任务用异步的方式交替执行。
主要用到的库:gevent、queue
框架
Scrapy框架: Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架.该框架是封装的,包含 request (异步调度和处理)、下载器(多线程的 Downloader)、解析器(selector)和 twisted(异步处理)等。对于网站的内容爬取,其速度非常快捷。
三个辅助工具
自动化工具
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
邮件工具
smtplib和email模块,前者负责连接服务器、登录、发送和退出的流程。后者负责填输邮件的标题与正文。
定时工具
schedule模块:Python中的轻量级的定时任务调度的库:schedule。它可以完成每分钟,每小时,每天,周几,特定日期的定时任务。