【代码回溯】最简单的一个python爬虫代码
人在江湖飘,总是会忘记很多旧事。
有些代码写完以后,下次见面变成了陌路之客。
—————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的内容(即图片)保存