目录
0.安装库的方式(此处仅记录windows操作系统的安装方式)
此篇文章仅根据个人的学习和理解,如有错误,还望指正,万分感谢!!!
爬虫的流程:
第一步:获取网页内容 (网页获取内容相关的模块,这里使用Requests模块。是第三方库需要自行安装。)
第二步:解析网页内容 (解析网页内容的相关模块,这里使用bs4模块中的BeautifulSoup类。是第三方库需要自行安装。)
第三步:存储或分析数据 (此处仅记录数据的存储部分,使用到的模块有os模块,os模块是python自带的库不需要自行安装。)
有关用户从服务器中得到网页的基本过程:
首先是用户向服务器发送一个请求,然后服务器得到请求后进行处理,最后返回给用户一个相应。这里通常使用的是HTTP请求与HTTP响应。
1.HTTP请求:
HTTP全称为Hypertext Transfer Protocol (超文本传输协议)
http的常见的请求方法:
1. GET方法:获得数据。(得到网页内容的请求)
2. POST方法:创建数据。(将用户的账号密码等给到服务器的请求)
http请求:
包括 :
1.请求行(包含方法类型、资源路径、协议版本,资源路径中常包含查询信息)
2.请求头(包含服务器的一些信息:Host指主机域名;User-Agent用来告知服务器客户端的相关信息;Accept用来告知服务器,客户端想接收的响应数据是什么类型的,多种类型用逗号分隔开,其中类型*/*表示任何类型都可以)
3.请求体(包含客户端传给服务器的其他任意数据,GET方法中一般都是空的。)
2.HTTP响应:
服务器接收过请求后发出的响应。
http相应包括:
1.状态行(包含协议版本、状态码、状态消息)
状态码与状态消息相对应:
200 OK //客户端请求成功(其中200代表状态码,OK代表状态信息,下面👇🏻类似。)
301 Moved Permanently //资源被永久移动到新地址
400 Bad Request //客户端不能被服务器所理解
401 Unauthoruzed //请求为经授权
403 Forbidden //服务器拒绝提供服务
404 Not Found //请求资源不存在
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端请求
2.响应头(包含一些告知客户端的信息)
3.响应体(包含服务器想给客户端的数据内容)
0.安装库的方式(此处仅记录windows操作系统的安装方式)
第一步:打开终端(快捷方式:win+r—>输入cmd—>回车)
第二步:在终端执行pip命令,分别安装所需要的第三方库(pip install 第三方库的名称)
( pip install requests #安装requests模块
pip install bs4 #安装bs4模块 )
学习爬虫时需要遵循相应的规则,不得随意进行对网页进行恶意的爬取。以下爬取方式均属于不正当的方式:
- DDos攻击:通过给服务器发送海量高频的请求,让网络资源被耗尽
- 具有反爬机制的的网站不得爬取,如:需要进行验证吗进行验证的网站。
- 查看网站的robots.txt文件,了解可爬取的范围。(查看robots协议的方法:在浏览器中直接输入对应网站的网址+robots.txt )
- 不得对隐私数据进行爬取。!!!
1.requests模块(请求)
requests库用于对相应网址进行访问,得到服务器返回的网页源代码。
接下来就是对requests库中的函数进行使用了。
requests模块中最重要的是get方法。
get方法的使用:
requests.get(url,params,data,headers) #第一个参数填写需要访问的url,然后在指定参数headers为自己定义的headers,(headers即浏览器标识。)
使用一个变量来存储requests.get()返回的值,如:respoes = requests.get(url,headers = headers )
查看访问状态的方法:
print(response) #此处response为已经存储get返回值的变量 返回一个标签 如:<Response [200]>
print(response.status_code) #直接返回状态码 如:200
response.Ok #用于判断返回的状态信息是否为OK,其值为Bool类型。
查看返回的源代码的方法:
print(response.text) #得到访问网页的源代码,并且是一个字符串类型的数据。
在进行网页爬取时,对服务器发送请求时,有时会出现错误,原因可能是服务器对发送的请求进行了检查,识别出发送请求的是机器人,从而拒绝了其访问。
解决办法:添加请求头headers,即浏览器标识,找到浏览器标识(随便点进去一个网页,然后右键点击检查,点击网络network,F5进行刷新,随便点进去一个包,翻到最后找到user_agent,其后的数据即是相应的浏览器标识), 然后将其复制到代码中的headers中,然后作为实参传递给requests.get()方法的headers参数中去即可。(相当于在请求头中添加了headers相关的信息)
详细代码如下:
import requests #导入requsets模块
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20111101 Firefox/111.0"}
#heads是浏览器的标识,此表示的作用就是对访问该网址的用户进行检测,判断其是否为机器爬取,若是机器爬取则进行拒绝访问(这是对爬虫的一种防范措施)。
response = requests.get("http://books.toscrape.com",headers = headers)
#开始对某网址进行爬取,并加上请求头文件heads。
print(response.status_code) #用于得到状态信息。若为200则为访问成功。
# print(response.text) #.text用于得到网页的文本信息,返回的是一个字符串类型的文本。
# print(response) #可以直接得到状态信息
以上代码输出结果如下:
2.bs4库(解析)
1.基础用法:
bs4库主要用来解析所得到的网页源代码,可以对需要的某些信息进行有效的提取。其中最重要的是bs4库中的BeautifulSoup类。
使用BeautifulSoup(文本,解析器) #其中“文本”部分为需要解析的源代码(即使用requests.get()得到的源代码),解析器部分在解析html时只需填写“html.parser”即可。
完整使用方法:soup = BeautifualSoup(content,"html.parser")
若想打印出某一标签下的内容只需:print(soup.p) #此处的p可以为任意标签名,但是此方法只会返回所找到的第一个与之匹配的标签。
如果想要匹配该文本中的所有标签则需要使用到findAll()函数,该函数还可以进行精确匹配。如:soup.findAll("p",attrs={"class":"price_color"}) #可以匹配到该文本中的所有属性class为price_color的p标签。其中findAll()返回的是一个可迭代对象。
如果想要去除掉标签,只得到标签中的文字,则需要使用.string方法,如:print(price.string) #此处price为一个已经匹配的文本,在对该文本进行提取文字。
完整的使用代码如下:
import requests from bs4 import BeautifulSoup headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20111101 Firefox/111.0"} content = requests.get("http://books.toscrape.com",headers = headers).text soup = BeautifulSoup(content,"html.parser") # print(soup.p) #只打印出p标签中的内容 all_price = soup.findAll("p",attrs={"class":"price_color"}) #返回一个可迭代的列表 attrs可以找到某一属性值 #print(all_price) #打印出所有匹配的标签 for price in all_price: #遍历列表 # print(price) #打印列表中的每一个元素 print(price.string) #输出列表元素并且只输出其中的字符 # print(price.string[2:]) #输出列表元素并且只输出其中的字符,并且进行切片操作
以上代码执行后如下:
网址http://books.toscrape.com的具体网页内容如下(上面的代码只是对该网址中的价格进行了爬取):
2.扩充用法:
BeautifulSoup中其他方法 :
soup = BeautifulSoup(content,"lxml") #其中content为需要解析的文本,"lxml"为解析库,需自行安装,这里不进行详细介绍。
soup.tagName:返回的是网页源码中出现的tagName对应的标签。
soup.find: 1.find('tagName'):等同于soup.tagName只是找到第一个匹配的标签 。 soup.find('tagName',class_/id/attr = "song")
soup.find_all:返回符合要求的所有标签(是一个列表)
select(‘某种选择器(id,class,标签...选择器)’):返回一个列表
soup.select(‘.tang>ul>li>a’):“>”表示的是一个层级 可以省略">"而用空格来表示多个层级,如:soup.select(".tang> >a")
soup.a.text:可以获取标签之间的文本数据 (获取某一标签下的所有文本内容)
soup.a.string:等同于soup.a.text
soup.a.get_text():只可以获取该标签下面直系的文本内容。
3.os库
os模块是python中内置的与操作系统和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。
os模块操作目录相关的函数:
os.getcwd() #返回当前的工作目录
os.listdir(path) #返回指定路径下的文件和目录信息
os.mkdir(path,mode) #创建目录
os.makedirs(path1,path2,path3...) #创建多级目录
os.rmdir(path) #删除目录
os.removedirs(path1,path2,path3...) #删除多级目录
os.chdir(path) #将path设置为当前目录
部分代码如下:
import os
print(os.getcwd()) #打印出当前目录
os.makedirs("一级目录/二级目录/三级目录") #创建多级目录:"一级目录/二级目录/三级目录/"
os.removedirs("一级目录/二级目录/三级目录") #删除多级目录:"一级目录/二级目录/三级目录/"
file = open(filename,mode,encoding) #file为变量名,filename为需要打开的文件名称,mode为打开模式(默认为只读模式),encoding为打开文本文件的编码格式(默认为gbk)
文件的打开模式如下:
- r:只读模式打开文件,文件的指针将会放在文件的开头
- w:只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件指针在开头
- a:追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加内容,文件指针在源文件末尾。
- b:以二进制方式打开文件,不能单独使用,需要与其他模式一起使用,rb或者wb
- +:以读写方式打开文件,不能单独使用,需要与其它模式一起使用,a+
注意最后需要关闭文件,file.close
对文件进行写入:file.write(str(content),+\n) #content为将要写入的内容,并将内容转换为字符串类型,并且在最后添加了一个换行符。
filename = "text1.txt"
#一只写的方式打开文件text1.txt,如果不存在则创建,如果存在则覆盖原文件的内容
file = open(filename,"w",encoding="utf-8")
#创建一个列表
n=["1.霓虹","2你好","3你吼","4\(@^0^@)/","5.haha",65464664,7357687,8638736,9365763]
#循环遍历列表元素
for i in n:
#将遍历出来的元素转换为字符串类型添加到文件中去,并且在最后添加一个换行符
file.write(str(i)+"\n")
file.close() #!!!注意要关闭文件
以上程序执行后得到如下结果:
4.HTML网页结构
网页三大要素:HTML、CSS、JavaScript。
- HTML:定义网页的结构信息。
- CSS:定义网页的样式。
- JavaScript:定义用户和网页的交互逻辑。
常见的HTML标签:
1.标题标签:
<h1></h1> <h2></h2> <h3></h3> <h4></h4> <h5></h5> <h6></h6> #数字越小其字号越大
2.文本段落标签:
<p></p>
3.换行标签:
<br>
4.加粗标签:
<b></b>
5.斜体标签:
<i></i>
6.下划线标签:
<u></u>
7.图片标签:
<img> #例:<img src = " 图片链接/路径 " width = "500px" hight = "500px"> # width 用于设置图片的宽度,hight用于设置图片的高度
8.链接标签:
<a href = "链接..." target = "_self 或_blank"></a> #herf表示要跳转的url地址,target的值_self表示在当前窗口跳转链接_blank表是在新窗口打开
9.容器标签:
<div></div> #相当于一个空标签,里面可以放其他标签,好处是可以批量处理。
<span></span> #div与span 的区别:div是块级元素,一行最多放一个div元素;span是内联元素,一行可以有多个span元素
10.有序列表标签:
<ol></ol> #ordered list 的简写 经过浏览器渲染后其前方为有序的行数字
11.无序标签:
<ul></ul> #undered list 的简写,其经过浏览器渲染后其前方为“_”或“•”
12.表格标签:
<table></table>
表格头部标签:<thead></thead>
表格主体标签:<tbody></tbody>
表格行标签:<tr></tr>
单元格标签:<td></td>
属性:
class属性:可以被运用在所有元素上,可以帮助分组
例:<p class = "content">我是content类</p> <p class = "content">我也是content类</p>
部分代码演示如下:
<!DOCTYPE html>
<html>
<head>
<base href="http://www.runoob.com/images/" target="_blank">
</head>
<body>
<h1>这是一个一级标题</h1>
<h2>这是一个二级标题</h2>
<h3>这是一个三级标题</h3>
<h4>这是一个四级标题</h4>
<h5>这是一个五级标题</h5>
<h6>这是一个六级标题</h6>
<h7>这是一个七级标题</h7>
<p>这是第一段</p>
<p>这是第二段</p>
<table border = "3">
<thead>
<tr>
<td>表头1</td>
<td>表头2</td>
</tr>
</thead>>
<tbody>
<tr>
<td>111</td>
<td>222</td>
</tr>
<tr>
<td>333</td>
<td>444</td>
</tr>
</tbody>
</table>>
</body>
</html>
以上代码执行后结果如下:
最后仅以一句话来共勉一路奋斗中的人:
如果痛恨所处的黑暗,请你成为你想要的光。 —— 顾城
以上内容均来自网络与书籍的学习,个人能力有限,如有错误,还望谅解。