前言:我错了,但下次也不一定(●’◡’●)
米娜桑,好久不见,不知道这段时间各位手中的西瓜刀有没有按时擦亮呢?
我也是在摸爬滚打将近一年之后总算是找到了一点人生的方向所以当成救命稻草现在正死死握紧不放手的啊。
这一年真的是经历了很多,发生了很多事,做了很多次选择,但可能我身上已经被锁定了『反向预测』的笨拙诅咒导致走了很多弯路,但好在是好好的活到了出头之日了。
(抽奖的事一直在参与,从未被选中,呜呜呜,岷叔!)
(没错,永恒mc更新啦!!!所以我现在是边看岷叔边写博客,为人民服务!!!)
总之,之后就开始恢复更新了。内容的话更多的会偏向于一些知识的学习笔记。同时也包括一些其他软件的使用教程,mathematicas的使用之后也会继续更新的,敬请期待。
那么思索了很久之后,决定先开始Python爬虫的学习。
因为这对于学(you)习(xi)资源的收集具有很大的帮助,算是Rain氏科技树的根源工具。
教学资源(持续更新…)
本次Python爬虫学习所用的网络资源如下所示,如果有更好的资源还请慷慨分享,谢谢!
1. 【Python+爬虫】爆肝两个月!拜托三连了!这绝对是全B站最用心(没有之一)的Python+爬虫公开课程,从入门到(不)入狱 !
一. 爬虫的基本流程
一般爬虫的基本流程包含三步:获取网页内容、解析网页内容与存储数据。
接下来本篇将主要介绍获取网页内容与解析网页内容的相关信息以及如何使用Python中的requests
库与BeautifulSoup
库完成该工作。
二. 获取网页内容
2.1 相关概念
获取网页内容的基本方式:客户端向服务端发送HTTP请求。
HTTP,全称Hypertext Transfer Protocol,又称超文本传输协议。
当服务端收到请求之后,会向客户端返回一个状态码与其他内容。
以下为常见的响应状态码:
我知道我知道,各位来看我的博客那肯定不是想看这些书本定义的,是想看整活的,我懂得我懂得。
那么接下来,我们就以三国的角度来看一下这些状态码的含义。
首先,我们将发送HTTP请求的客户端,也就是我们,比作是张翼德大将军;
而服务器,则比作是诸葛村夫军师 ;
HTTP请求,就看作是张将军的请战令。
那么上面的状态码,实际上就和下面的情况类似:
2.1.1 状态码以2开头(例如200)
2.1.2 状态码以3开头(例如301)
2.1.3 状态码以4开头(例如最常见的404)
2.1.4 状态码以5开头(例如500)
HTTP请求在结构上一般包含三个部分:请求行、请求头与请求体,类型上可分为GET请求与POST请求。具体信息如下所示。
2.2 Python实现—Requests
可以用于实现获取网页内容的方法有很多,这次我们先介绍如何使用requests库进行该工作。
2.2.1 相关库的安装
pip install requests
这里也提供一篇参考文章:requests库的详细安装过程
2.2.2 代码实现
# 发送Http请求
import requests
# 要爬取的网站
url = "https://books.toscrape.com"
# 设置请求头,将爬虫伪装成浏览器身份,反爬措施
# 具体内容请详见B站学习视频
headers = {
# 这里最好填自己电脑上的,用F12查看
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.41"
}
# 发送Http请求
response = requests.get(url=url, headers=headers)
# 响应码,响应成功为200
print(response.status_code)
# 响应状态,成功为True
print(response.ok)
# 网站内容,类型为字符串
print(response.text)
三. 解析网页内容
3.1 相关概念
在我们成功获取到网站内容之后,便要开始进行数据清洗工作,也就是解析网页内容。
一个网站的内容主要包含三部分:HTML代码、CSS代码与JavaScript代码。而对于我们来说,存储着网页结构与信息的HTML代码相对而言更加具有研究价值。
所以我们的数据清洗工作也主要是对HTML代码进行处理。
那么接下来,你会觉得我要讲HTML了。抱歉,这个东西我也有点无能为力了,还请参考上面的网络视频。
说起来,我不得不点一位我们学院的老师了。
某些人真的是够够的,一个web课一周就两节课,每次都不来,就让学生自己去机房对着课本敲代码。等到期末了终于看见人影了。
哎,自己肯定也是有问题的。
之后也会有前端学习的内容的,总不能因为别人的不对而阻止自己学习有趣的东西吧。
3.2 Python实现——BeautifulSoup
3.2.1 相关库的安装
pip3 install Beautifulsoup4
这里也提供一篇参考文章:Python安装Bs4几种方法
3.2.2 代码实现
from bs4 import BeautifulSoup
import requests
url = "https://books.toscrape.com"
# 伪装爬虫, 设置请求头
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.41"
}
def get_response_by_requests(url, headers):
# 发起Http响应
response = requests.get(url=url, headers=headers)
return response
if __name__ == '__main__':
response = get_response_by_requests(url=url, headers=headers)
print(f"状态码:{response.status_code}")
if response.ok:
print("请求成功")
# 获取网页的html源码
html_text = response.text
# 利用bs处理为树状结构,方便清洗
# soup为树状结构
soup = BeautifulSoup(html_text, "html.parser")
# 先序遍历的第一个p标签内容
print(soup.p)
# 先序遍历的第一个img标签内容
print(soup.img)
# bs的findall方法
# 查找网页中所有class属性为price_color的p标签
all_prices = soup.findAll("p", attrs={"class": "price_color"})
#Type : <class 'bs4.element.ResultSet'>
print(f"Type:{type(all_prices)}")
for price in all_prices:
# price.string:标签包围的文本内容
print(price.string)
# 获得所有h3标签元素
all_titles = soup.findAll("h3")
for title in all_titles:
# 获得所有的a标签元素
all_links = title.findAll("a")
for link in all_links:
# 获得a标签包围的文本
print(link.string)
else:
print("请求失败")
我第一次学爬虫时,当时用的解析器是lxml
,这里用的是html.parser
,建议挑选一个自己用着习惯的来。
相关资料:Beautiful Soup的用法(六):解析器的选择
四. 后话
练习的代码我没有放出来,是因为之前发过一个爬取链家房源的博客结果被下架了,再加上我这天天嚯嚯豆瓣给我封了好几次ip,我也不太敢搞了,所以还请自行尝试。
这一年下来热情什么的也有些被磨平了,再加上最近写论文导致可能写作风格和之前差异较大了,还请见谅。
但我仍然在努力保留着这一小团热情的火种,坚持下去。
任重而道远吧。
中二少年的日常
I stand upon my desk to remind myself that we must constantly look at things in a different way.
Just when you think you know something,you have to look at it in another way.Even though it may seem silly or wrong,you must try.
You must strive to find your own voice.Because the longer you wait to begin,the less likely you are to find it at all.
Thoread said,"Most men lead lives of quiet desperation."Don’t be resigned to that.Break out.