注册网站刀具与钢材经营范围,seo的中文是什么,网站开发主要工作内容,wordpress knowhow文章目录
0x01#xff1a;引子
首先介绍一下网络爬虫是什么#xff0c;可以用来做什么#xff1f;
这里简单探讨一下网络爬虫的合法性
正式进入爬虫实战前#xff0c;需要我们了解下网页结构
HTML
CSS
JScript
写一个简单的 HTML
0x02#xff1a;实操
安装依赖 …
文章目录
0x01引子
首先介绍一下网络爬虫是什么可以用来做什么
这里简单探讨一下网络爬虫的合法性
正式进入爬虫实战前需要我们了解下网页结构
HTML
CSS
JScript
写一个简单的 HTML
0x02实操
安装依赖
爬虫的基本原理
统计分析CSDN博客阅读数据
使用 GET 方式抓取数据
使用 Beautiful Soup 解析网页
统计CSDN博客数据
统计博客园博客阅读量
0x03后记 推荐补充阅读『Python开发实战菜鸟教程』工具篇手把手教学使用VSCode开发Python
0x01引子
这是一个网络爬虫快速入门实战教程笔者希望读者能跟着这个博客进行实操从而掌握网络爬虫的原理与基本操作。部分内容参考自http://c.biancheng.net/view/2011.html
代码开源地址https://github.com/xiaosongshine/simple_spider_py3 这个博客以下内容
了解网络爬虫了解网页使用 requests 库抓取网站数据使用 Beautiful Soup 解析网页手把手实战操作统计分析CSDN与博客园博客阅读数据 首先介绍一下网络爬虫是什么可以用来做什么 百度百科对网络爬虫介绍如下 网络爬虫是一种按照一定的规则自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。 可以看出爬虫就是一个程序或者说是脚本本质就是一个代码。代码的内容是编程人员设计的一个特定规则代码执行的结果就是可以自动从万维网互联网抓取信息。 网络爬虫的原理如上图所示可能有些名词读者还不了解不用怕后面内容会有详细说明介绍。举个实际例子来说明一下网络爬虫用法 比如想收集我的女神刘亦菲照片一般的操作就会是从百度搜索刘亦菲的照片然后一张张从网页上下载下来 手动下载会比较费时费力其实这是就可以用Python编写网络爬虫代码来实现从这个网页里自动规则的下载图片从互联网获取数据。 小宋说上面是简单介绍了下网络爬虫的一个简单用法其实网络爬虫的功能十分强大。可以爬取照片、视频、音乐与文本等但这些只是很基本的用法基于上述功能其实可以实现更多应用。随着大数据与人工智能的发展数据的重要性越来越大。计算机视觉与语言模型的迅速发展离不开大规模的数据而好多数据都是在互联网上需要使用网络爬虫进行筛选抓取。 这里简单探讨一下网络爬虫的合法性
几乎每一个网站都有一个名为 robots.txt 的文档当然也有部分网站没有设定 robots.txt。对于没有设定 robots.txt 的网站可以通过网络爬虫获取没有口令加密的数据也就是该网站所有页面数据都可以爬取。如果网站有 robots.txt 文档就要判断是否有禁止访客获取的数据。 以淘宝网为例在浏览器中访问 https://www.taobao.com/robots.txt如下图所示。 淘宝网允许部分爬虫访问它的部分路径而对于没有得到允许的用户则全部禁止爬取代码如下 User-Agent:* Disallow:/
这一句代码的意思是除前面指定的爬虫外不允许其他爬虫爬取任何数据。 正式进入爬虫实战前需要我们了解下网页结构
网页一般由三部分组成分别是 HTML超文本标记语言、CSS层叠样式表和 JScript活动脚本语言。
HTML
HTML 是整个网页的结构相当于整个网站的框架。带“”、“”符号的都是属于 HTML 的标签并且标签都是成对出现的。 常见的标签如下
html../html 表示标记中间的元素是网页 body../body 表示用户可见的内容 div../div 表示框架 p../p 表示段落 li../li表示列表 img../img表示图片 h1../h1表示标题 a href../a表示超链接
CSS
CSS 表示样式图 1 中第 13 行style typetext/css表示下面引用一个 CSS在 CSS 中定义了外观。
JScript
JScript 表示功能。交互的内容和各种特效都在 JScript 中JScript 描述了网站中的各种功能。 如果用人体来比喻HTML 是人的骨架并且定义了人的嘴巴、眼睛、耳朵等要长在哪里。CSS 是人的外观细节如嘴巴长什么样子眼睛是双眼皮还是单眼皮是大眼睛还是小眼睛皮肤是黑色的还是白色的等。JScript 表示人的技能例如跳舞、唱歌或者演奏乐器等。
写一个简单的 HTML
通过编写和修改 HTML可以更好地理解 HTML。首先打开一个记事本然后输入下面的内容
html
headtitle Python 3 爬虫与数据清洗入门与实战/title
/head
bodydivpPython 3爬虫与数据清洗入门与实战/p/divdivullia hrefhttp://c.biancheng.net爬虫/a/lili数据清洗/li/ul/div
/body
输入代码后保存记事本然后修改文件名和后缀名为HTML.html 运行该文件后的效果如下图所示。 这段代码只是用到了 HTML读者可以自行修改代码中的中文然后观察其变化。
通过上述内容我们了解了网络爬虫的基本原理与用途同时也对网页结构也有了认识。下面让我们进入实战操作部分通过统计分析博客园与CSDN博客阅读数据来快速掌握网络爬虫。 0x02实操
安装依赖
实战操作部分基于Python语言Python3版本还有用到requests与Beautiful Soup库分别用于请求网络连接与解析网页数据。
由于Beautiful Soup 目前已经被移植到 bs4 库中也就是说在导入 Beautiful Soup 时需要先安装 bs4 库。安装好 bs4 库以后还需安装 lxml 库。如果我们不安装 lxml 库就会使用 Python 默认的解析器。尽管 Beautiful Soup 既支持 Python 标准库中的 HTML 解析器又支持一些第三方解析器但是 lxml 库具有功能更加强大、速度更快的特点因此笔者推荐安装 lxml 库。
所以第一步先安装这些用到的库在命令行执行
pip install requests
pip install bs4
pip install lxml
爬虫的基本原理
网页请求的过程分为两个环节
Request 请求每一个展示在用户面前的网页都必须经过这一步也就是向服务器发送访问请求。Response响应服务器在接收到用户的请求后会验证请求的有效性然后向用户客户端发送响应的内容客户端接收服务器响应的内容将内容展示出来就是我们所熟悉的网页请求如下图所示。 网页请求的方式也分为两种
GET最常见的方式一般用于获取或者查询资源信息也是大多数网站使用的方式响应速度快。POST相比 GET 方式多了以表单形式上传参数的功能因此除查询信息外还可以修改信息。 所以在写爬虫前要先确定向谁发送请求用什么方式发送。
由于这次博客是一个简单入门教程仅使用GET来实现对统计分析CSDN与博客园博客阅读数据复杂的POST方式先不介绍将在下篇中详细介绍。 统计分析CSDN博客阅读数据 首先我们通过操作如何统计CSDN数据来学习网络爬虫基本操作。 使用 GET 方式抓取数据
首先演示如何使用GET进行网络访问编写如下Python代码
import requests #导入requests包
url https://xiaosongshine.blog.csdn.net/
strhtml requests.get(url) #Get方式获取网页数据
print(strhtml.text)
运行结果如下所示 已经可以正确获取笔者主页数据https://xiaosongshine.blog.csdn.net/ 加载库使用的语句是 import库的名字。在上述过程中加载 requests 库的语句是import requests。 用 GET 方式获取数据需要调用 requests 库中的 get 方法使用方法是在 requests 后输入英文点号如下所示
requests.get
将获取到的数据存到 strhtml 变量中代码如下
strhtml request.get(url)
这个时候 strhtml 是一个 URL 对象它代表整个网页但此时只需要网页中的源码下面的语句表示网页源码
strhtml.text 使用 Beautiful Soup 解析网页
通过 requests 库已经可以抓到网页源码接下来要从源码中找到并提取数据。 输入下面的代码即可开启 Beautiful Soup 之旅对第一篇博客阅读量进行抓取
import requests #导入requests包
from bs4 import BeautifulSoup
url https://xiaosongshine.blog.csdn.net/
strhtmlrequests.get(url)
soupBeautifulSoup(strhtml.text,lxml)
data soup.select(#articleMeList-blog div.article-list div:nth-child(1) div.info-box.d-flex.align-content-center p span:nth-child(2))
print(data)
代码运行结果下示
[span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/105/span]
可以看出已经获取到对应的第一篇阅读量105这个数字会随着阅读数量增加以实际为准。 Beautiful Soup 库能够轻松解析网页信息它被集成在 bs4 库中需要时可以从 bs4 库中调用。其表达语句如下
from bs4 import BeautifulSoup
首先HTML 文档将被转换成 Unicode 编码格式然后 Beautiful Soup 选择最合适的解析器来解析这段文档此处指定 lxml 解析器进行解析。解析后便将复杂的 HTML 文档转换成树形结构并且每个节点都是 Python 对象。这里将解析后的文档存储到新建的变量 soup 中代码如下
soupBeautifulSoup(strhtml.text,lxml)
接下来用 select选择器定位数据定位数据时需要使用浏览器的开发者模式将鼠标光标停留在对应的数据位置并右击然后在快捷菜单中选择“检查”命令如下图所示 随后在浏览器右侧会弹出开发者界面右侧高亮的代码对应着左侧高亮的数据文本。右击右侧高亮数据在弹出的快捷菜单中选择“Copy”➔“Copy Selector”命令便可以自动复制路径。 将路径粘贴在文档中代码如下:
#articleMeList-blog div.article-list div:nth-child(1) div.info-box.d-flex.align-content-center p span:nth-child(2)
这里的div:nth-child(1)其实对应的就是第一篇文章如果想获取当前页面所有文章阅读量 可以将 divnth-child1中冒号包含冒号后面的部分删掉代码如下
#articleMeList-blog div.article-list div div.info-box.d-flex.align-content-center p span:nth-child(2)
使用 soup.select 引用这个路径代码如下
data soup.select(#articleMeList-blog div.article-list div div.info-box.d-flex.align-content-center p span:nth-child(2))
为了方便查看我们可以遍历输出data整体代码如下.text就可以获取到元素中的文本但是注意是字符串类型的。
import requests #导入requests包
from bs4 import BeautifulSoup
url https://xiaosongshine.blog.csdn.net/
strhtmlrequests.get(url)
soupBeautifulSoup(strhtml.text,lxml)
data soup.select(#articleMeList-blog div.article-list div div.info-box.d-flex.align-content-center p span:nth-child(2))
for d in data:print(d,d.text,type(d.text))
输出为
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/105/span 105 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/977/span 977 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/5425/span 5425 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/4093/span 4093 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/539/span 539 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/170/span 170 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/510/span 510 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/695/span 695 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/1202/span 1202 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/969/span 969 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/3126/span 3126 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/2779/span 2779 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/7191/span 7191 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/27578/span 27578 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/2167/span 2167 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/7046/span 7046 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/40308/span 40308 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/13571/span 13571 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/10535/span 10535 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/6367/span 6367 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/1820/span 1820 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/1947/span 1947 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/5054/span 5054 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/3046/span 3046 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/6491/span 6491 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/3103/span 3103 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/13892/span 13892 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/14816/span 14816 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/342/span 342 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/5276/span 5276 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/13097/span 13097 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/64/span 64 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/65/span 65 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/246/span 246 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/446/span 446 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/128/span 128 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/30/span 30 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/207/span 207 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/355/span 355 class str
span classread-numimg alt srchttps://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png/19/span 19 class str
其实通过上述代码我们已经可以获得第一页的阅读量下面只需对所有页面进行一个统计即可。
为了获得分页信息的url可以通过点击最下方的页面导航栏获取 可以看出页面1的url为https://xiaosongshine.blog.csdn.net/article/list/1
后面的数字1代表第一页。笔者尝试用selecter来获取页数如下
data soup.select(#Paging_04204215338304449 ul li.ui-pager)
输出为空不知道是不是哪里被限制了欢迎了解的小伙伴们评论区指出。 统计CSDN博客数据
可以看出博主文章总的页数为7这里笔者直接设置总页数为7做个循环来获取所有博客阅读量整体代码如下
import requests #导入requests包
from bs4 import BeautifulSoup
read_all 0
for i in range(7):url https://blog.csdn.net/xiaosongshine/article/list/%d%(i1)strhtmlrequests.get(url)soupBeautifulSoup(strhtml.text,lxml)data soup.select(#articleMeList-blog div.article-list div div.info-box.d-flex.align-content-center p span:nth-child(2))##Paging_04204215338304449 ul li.ui-pagerfor d in data:#print(d,d.text,type(d.text))read_all eval(d.text)print(read_all)
输出为710036这个数字会随着阅读数量增加以实际为准
如果想统计你自己的阅读量更换url并且设置页数即可。 统计博客园博客阅读量 方法与统计CSDN类似获取当前页面的阅读量再对所有页面求和。
统计当前页面阅读量代码
import requests #导入requests包
from bs4 import BeautifulSoupurl https://www.cnblogs.com/xiaosongshine
strhtmlrequests.get(url)
soupBeautifulSoup(strhtml.text,lxml)
data soup.select(#mainContent div div div.postDesc span.post-view-count)for d in data:print(d,d.text[3:-1],type(d.text))
输出
span classpost-view-count data-post-id11615639阅读(16603)/span 16603 class str
span classpost-view-count data-post-id11394918阅读(880)/span 880 class str
span classpost-view-count data-post-id11362228阅读(3217)/span 3217 class str
span classpost-view-count data-post-id11346550阅读(2812)/span 2812 class str
span classpost-view-count data-post-id11303187阅读(1599)/span 1599 class str
span classpost-view-count data-post-id10929934阅读(3386)/span 3386 class str
span classpost-view-count data-post-id10926391阅读(803)/span 803 class str
span classpost-view-count data-post-id10880094阅读(3527)/span 3527 class str
span classpost-view-count data-post-id10874644阅读(12612)/span 12612 class str
span classpost-view-count data-post-id10858829阅读(245)/span 245 class str
span classpost-view-count data-post-id10858690阅读(824)/span 824 class str
span classpost-view-count data-post-id10841818阅读(3043)/span 3043 class str
span classpost-view-count data-post-id10831931阅读(20058)/span 20058 class str
span classpost-view-count data-post-id10765958阅读(3905)/span 3905 class str
span classpost-view-count data-post-id10750908阅读(4254)/span 4254 class str
span classpost-view-count data-post-id10740050阅读(2854)/span 2854 class str
span classpost-view-count data-post-id10739257阅读(1759)/span 1759 class str
span classpost-view-count data-post-id10644401阅读(1729)/span 1729 class str
span classpost-view-count data-post-id10618638阅读(2585)/span 2585 class str
span classpost-view-count data-post-id10615575阅读(1861)/span 1861 class str
span classpost-view-count data-post-id11652871阅读(1704)/span 1704 class str
span classpost-view-count data-post-id11651856阅读(2301)/span 2301 class str
span classpost-view-count data-post-id11635312阅读(3648)/span 3648 class str
span classpost-view-count data-post-id11620816阅读(671)/span 671 class str
span classpost-view-count data-post-id11615639阅读(16603)/span 16603 class str
span classpost-view-count data-post-id11394918阅读(880)/span 880 class str
span classpost-view-count data-post-id11362228阅读(3217)/span 3217 class str
span classpost-view-count data-post-id11359003阅读(2209)/span 2209 class str
span classpost-view-count data-post-id11356047阅读(696)/span 696 class str
span classpost-view-count data-post-id11346550阅读(2812)/span 2812 class str 获取页数
import requests #导入requests包
from bs4 import BeautifulSoupurl https://www.cnblogs.com/xiaosongshine/default.html?page2
#页面为第一页时无法显示总页数所以选择访问第二页htxt requests.get(url)soupBeautifulSoup(htxt.text,lxml)data soup.select(#homepage_top_pager div a)for d in data:print(d)MN len(data)-2
#减去前一页与后一页标签
统计博客园阅读量完整代码
import requests #导入requests包
from bs4 import BeautifulSoupurl https://www.cnblogs.com/xiaosongshine/default.html?page2
#页面为第一页时无法显示总页数所以选择访问第二页htxt requests.get(url)soupBeautifulSoup(htxt.text,lxml)data soup.select(#homepage_top_pager div a)for d in data:print(d)MN len(data)-2
#减去前一页与后一页标签
read_all 0
for i in range(MN):url https://www.cnblogs.com/xiaosongshine/default.html?page%d%(i1)strhtmlrequests.get(url)soupBeautifulSoup(strhtml.text,lxml)data soup.select(#mainContent div div div.postDesc span.post-view-count)for d in data:#print(d,d.text[3:-1],type(d.text))read_all eval(d.text[3:-1])print(read_all)
输出
a hrefhttps://www.cnblogs.com/xiaosongshine/default.html?page1上一页/a
a hrefhttps://www.cnblogs.com/xiaosongshine/default.html?page11/a
a hrefhttps://www.cnblogs.com/xiaosongshine/default.html?page33/a
a hrefhttps://www.cnblogs.com/xiaosongshine/default.html?page44/a
a hrefhttps://www.cnblogs.com/xiaosongshine/default.html?page55/a
a hrefhttps://www.cnblogs.com/xiaosongshine/default.html?page3下一页/a
217599
简单感慨下CSDN阅读量72w博客园21W知乎63W腾讯云社区15W总阅读量180W离200W越来越近了继续努力。。 0x03后记 这是网络爬虫扫盲入门的第一篇内容写的较为简单后面的内容会不断加深变难内容将会涉及到如何使用POST实现模拟登陆以及如何抓取保存复杂数据文本等。 希望可爱又爱学的读者能和我一起坚持下去。代码开源地址https://github.com/xiaosongshine/simple_spider_py3 最后布置一个课后作业这个博客演示了如何统计总阅读量希望读者也能统计一下点赞和评论的数目与内容有问题欢迎及时和我交流互动呀。 这个博客对你有用的话欢迎收藏转发也麻烦可爱又爱学的你能赏个赞菜小宋更博不易在这里谢过啦。
如果你想学习更多开发技巧与AI算法欢迎搜索关注笔者公众号“简明AI”和爱学习讨论的小伙伴一起交流学习。