人在江湖飘,总是会忘记很多旧事。

有些代码写完以后,下次见面变成了陌路之客。

                                         —————HLK

 

这里是代码回溯专题,主要是回忆我自己写的代码及原理,让自己不会忘记曾经写下的东西。

 

那么今天来讲讲最最最初级的python爬虫程序,爬某网站的图片”

要爬的网页代码结构是

<html>
<head></head>
<body>
...
<img src="目标网址">
<img src="目标网址2">
<img src="目标网址3">
...
</body>
<html>

我们要做的操作是:

1、向网页发送请求并获得网页代码

2、解析网页代码里img标签的src属性,访问src属性里的网址并下载图片

 

  • 详细的操作说明

———————————————————————–

首先,本文用的组件为

请求库 Request

解析库 BeautifulSoup

 

所以请在py文件的最开头输入

import requests
from bs4 import BeautifulSoup

如果没有这两个库的话,请提前下载好。

———————————————————————–

1、向网页发送请求并获得网页代码

首先,最基础的代码是这三句。

response = requests.get(url, headers=header)      #发送带有请求头的请求
print(response)                                   #输出响应信号                                    
page_content = response.content.decode("utf-8")   #将网页内容以utf-8的编码格式输出

将page_content抓到手就算成功。(你可以用print或者open().write去看一下输出的结果与你在浏览器里看到的是否相同)

当响应信号为200的时候,说明请求成功。

其余情况请自行百度解决。

 

关于代码里的参数url和header:

url即你想要爬的网页网址。

header是向网页发送请求时附加的请求头。

一般是这样的格式。

    header = {
        \'accept-language\':\'zh-CN,zh;q=0.9,en;q=0.8;en-GB;q=0.7,en-US;q=0.6\',
        \'cache-control\': \'max-age=0\',
        \'accept-encoding\': \'gzip, deflate, br\',
        \'Upgrade-Insecure-Requests\': \'1\',
        \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36\'
    }

那么这个请求头的内容是怎么得来的呢?实际上是抄的浏览器访问网页时的请求头。

为了模仿浏览器浏览,请大家在该网站里用开发者工具先抓一下请求包,看看请求头的内容

下图是用Chrome的开发者工具查看的百度首页的请求头。(打开network,刷新该网页,然后查看第一个请求就行了。一定要刷新哦~)

这样你就可以将一些请求头里的数据复制到代码里,达到爬虫模仿浏览器的效果。(当然了,这只是最基本的爬虫操作,爬很多网站过不了关的)

 

 

2、解析网页代码里img标签的src属性,访问src属性里的网址并下载图片

获取了page_content之后,我们就需要用BeautifulSoup对其进行解析。

soup = BeautifulSoup(page_content, "html.parser")
imgs = soup.find_all(name=\'img\')                                                              #获取网页里关于所有img标签的数组

上方代码会返回一个包含所有img标签的数组,然后我们只要遍历数组,然后用get方法即可获得src值

———————————————————————————

在这之前我想了很多方法去取src值,都相当地麻烦。

感谢niewzh 大佬的博客,让我用两三条指令便轻松地获取了属性值

博客地址:https://blog.csdn.net/ScapeD/article/details/81813463

———————————————————————————

如下所示:get方法成功获取了src……不对,是data-aload值???

for a in imgs:                                                                                #遍历img标签数组里的所有值
    data_address = a.get(\'data-aload\')                                                        #用get方法将每个img标签里面对应的属性抽取出来

实际上获取的属性之所以是data-aload,原因是很多网站有特殊的屏蔽机制,src值在爬出的时候内容会变成”loading”之类的非网址值。(当然,也许只是我遇到的网站比较特殊)

而经过仔细分析,我发现data-aload属性里反而有我想要的值,因此改变了要爬的参数。

 

你的开头计划的需求,很可能会与实际不符,要时刻与现况看齐。

 

由于爬出来的标签中有一些没有相对应的属性(例如本文要爬的data-aload)的图片,那些就需要另外特殊处理,。

这里将我们所爬到的标签进行一些过滤和修补,然后就可以将对应网址的图片下载下来了。

if data_address !=  None:                                                                 #只对有src值的img标签进行操作
    data_address=data_address.split()[0];                                                 #返回的src值里有一行空行,此处将其处理了
    response = requests.get(data_address, headers=header)                                 #发送带有请求头的请求
    print("downloading")								  #提示信息,用来提示你正在保存图片
    open("本地的保存地址", "wb").write(response.content)          			  #将response的内容(即图片)保存

 

 

那么以上就是分步解析了,总的代码是这样的(无函数无类):

※有需要的还可以在里面加上num参数来方便给图片排序,或者加入time.sleep计时器方便调整下载速度之类的。

※这里的header都用了同一个请求头,具体情况还请具体分析

import requests
from bs4 import BeautifulSoup


#---------------------------------------     请求部分         -----------------------------------------------------
url = \'xxxxxxxxxxxxxx\'
header = {
    \'accept-language\':\'zh-CN,zh;q=0.9,en;q=0.8;en-GB;q=0.7,en-US;q=0.6\',
    \'cache-control\': \'max-age=0\',
    \'accept-encoding\': \'gzip, deflate, br\',
    \'Upgrade-Insecure-Requests\': \'1\',
    \'User-Agent\': \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36\'
}

response = requests.get(url, headers=header)      #发送带有请求头的请求
print(response)                                   #输出响应信号                                    
page_content = response.content.decode("utf-8")   #将网页内容以utf-8的编码格式输出



#---------------------------------------     解析部分         -----------------------------------------------------
soup = BeautifulSoup(page_content, "html.parser")
imgs = soup.find_all(name=\'img\')                                                              #获取网页里关于所有img标签的数组

for a in imgs:                                                                                #遍历img标签数组里的所有值
    data_address = a.get(\'data-aload\')                                                        #用get方法将每个img标签里面对应的属性抽取出来
    if data_address !=  None:                                                                 #只对有src值的img标签进行操作
    	data_address=data_address.split()[0];                                                 #返回的src值里有一行空行,此处将其处理了
    	response = requests.get(data_address, headers=header)                                 #发送带有请求头的请求
    	#print("downloading")							        #提示信息,用来提示你正在保存图片
        print(response)                                   				    #输出响应信号,用作故障测试检查点
    	open("本地的保存地址", "wb").write(response.content)          			      #将response的内容(即图片)保存

 

版权声明:本文为pumpkinhlk原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/pumpkinhlk/p/15161760.html