Python爬虫——个人学习分享

目录

有关用户从服务器中得到网页的基本过程:

1.HTTP请求:

http的常见的请求方法:

2.HTTP响应:

0.安装库的方式(此处仅记录windows操作系统的安装方式)

1.requests模块(请求)

2.bs4库(解析)

1.基础用法:

2.扩充用法:

3.os库

4.HTML网页结构


此篇文章仅根据个人的学习和理解,如有错误,还望指正,万分感谢!!!

爬虫的流程:

第一步:获取网页内容  (网页获取内容相关的模块,这里使用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模块  )

学习爬虫时需要遵循相应的规则,不得随意进行对网页进行恶意的爬取。以下爬取方式均属于不正当的方式:

  1. DDos攻击:通过给服务器发送海量高频的请求,让网络资源被耗尽
  2. 具有反爬机制的的网站不得爬取,如:需要进行验证吗进行验证的网站。
  3. 查看网站的robots.txt文件,了解可爬取的范围。(查看robots协议的方法:在浏览器中直接输入对应网站的网址+robots.txt  )
  4. 不得对隐私数据进行爬取。!!!

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)    #可以直接得到状态信息

以上代码输出结果如下: 

269ba509c9474397b1d54d794fb6748d.png

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:])       #输出列表元素并且只输出其中的字符,并且进行切片操作

 以上代码执行后如下:75f7b58d69de41298ba06427efb624a8.png

 网址http://books.toscrape.com的具体网页内容如下(上面的代码只是对该网址中的价格进行了爬取):

69fd56f78ba7413eb42ae607c6e419ff.png

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)

文件的打开模式如下:

  1. r:只读模式打开文件,文件的指针将会放在文件的开头
  2. w:只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有内容,文件指针在开头
  3. a:追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加内容,文件指针在源文件末尾。
  4. b:以二进制方式打开文件,不能单独使用,需要与其他模式一起使用,rb或者wb
  5. +:以读写方式打开文件,不能单独使用,需要与其它模式一起使用,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()    #!!!注意要关闭文件

 以上程序执行后得到如下结果:

5d889ebf50d74a5fb1c4a8e7186fe00c.png

4.HTML网页结构

网页三大要素:HTMLCSSJavaScript

  • 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>

以上代码执行后结果如下:

47fbdfd1ac6344a9972f8399d3510f8f.png

最后仅以一句话来共勉一路奋斗中的人:

如果痛恨所处的黑暗,请你成为你想要的光。 —— 顾城 


以上内容均来自网络与书籍的学习,个人能力有限,如有错误,还望谅解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值