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文档诞生了两个最为特殊的元素classid

属性: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访问博客,服务器会知道你是何人,你不需要再重复输入账号密码,就能直接访问。

 

存储

存储数据的方法有许多,其中最常见的是:csvexcel。当然也有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。它可以完成每分钟,每小时,每天,周几,特定日期的定时任务。

posted on 2021-08-06 17:30  毕达哥拉斯  阅读(306)  评论(0编辑  收藏  举报

导航