查看原文
其他

R 爬虫之爬取公众号图片

JunJunLab 老俊俊的生信笔记 2022-08-15






开始


相信很多小伙伴们入门生信时候会去搜狗的微信网址里搜索各种数据分析和绘图的教程和代码,都是一些 公众号 的博主写的文章,当然对大家代码的水平提升很有帮助。

今天尝试一下爬取我们搜索 关键词 后的结果的汇总,主要包含文章标题文章链接地址文章图片下载部分。

首先我们进入搜狗的微信浏览页面:

https://weixin.sogou.com/

假如我们想搜索 barplot 相关的公众号文章:

接下来爬取我们需要的东西。


下水


1、找出网址规律



可以看到和 barplot 相关的文章有 459 条记录,接下来我们找到每页网址的规律:

我们点击第二页和第三页的网址看看对比一下:

# 第二页
https://weixin.sogou.com/weixin?oq=&query=barplot&_sug_type_=1&sut=0&lkt=0%2C0%2C0&s_from=input&ri=99&_sug_=n&type=2&sst0=1627207816457&page=2&ie=utf8&p=40040108&dp=1&w=01015002&dr=1
# 第三页
https://weixin.sogou.com/weixin?oq=&query=barplot&_sug_type_=1&sut=0&lkt=0%2C0%2C0&s_from=input&ri=99&_sug_=n&type=2&sst0=1627207816457&page=3&ie=utf8&p=40040108&dp=1&w=01015002&dr=1

可以看到只有 page=2/3 这串字符变化,也就是对应我们的每页的页数,然后根据规律就可以拿出全部页的网址,默认每页网址显示的 10 篇文章:

# 加载包
library(rvest)
library(curl)
library(tidyverse)

# 构造网址
w1 = 'https://weixin.sogou.com/weixin?oq=&query=barplot&_sug_type_=1&sut=0&lkt=0%2C0%2C0&s_from=input&ri=99&_sug_=n&type=2&sst0=1627207816457&page='
w2 = '&ie=utf8&p=40040108&dp=1&w=01015002&dr=1'

# 总共有46页
web <- c()
for (i in 1:46) {
  web <- c(web,paste(w1,i,w2,sep = ''))
}
web
[1"https://weixin.sogou.com/weixin?oq=&query=barplot&_sug_type_=1&sut=0&lkt=0%2C0%2C0&s_from=input&ri=99&_sug_=n&type=2&sst0=1627207816457&page=1&ie=utf8&p=40040108&dp=1&w=01015002&dr=1"
[2"https://weixin.sogou.com/weixin?oq=&query=barplot&_sug_type_=1&sut=0&lkt=0%2C0%2C0&s_from=input&ri=99&_sug_=n&type=2&sst0=1627207816457&page=2&ie=utf8&p=40040108&dp=1&w=01015002&dr=1"
[3"https://weixin.sogou.com/weixin?oq=&query=barplot&_sug_type_=1&sut=0&lkt=0%2C0%2C0&s_from=input&ri=99&_sug_=n&type=2&sst0=1627207816457&page=3&ie=utf8&p=40040108&dp=1&w=01015002&dr=1"
...

到这里我们就构造好所有页数的对应网址了。

2、提取标题



接下来我们提取所有文章的标题:

# 提取标题
title <- c()
for (i in web) {
  title <- c(title,read_html(i,endcoing = 'utf-8') %>%
               html_nodes('h3 a') %>%
               html_text())
}
# 查看标题数量
length(title)
[1100
title
[1"Seaborn入门:详解barplot和countplot"
[2"【零基础学绘图】之绘制barplot柱状图图(四)"
[3"R语言绘图-柱状图barplot"

咦,怎么只有 100 个,不应该是 459 个嘛,我看了一下,这个网址好像需要登录才能查看更多的内容,就是一般进去最多能查看前面 10 页的内容。那就那这 100 个测试吧。

这里我们就获取了文章的标题。

3、文章链接地址



然后我们获取每篇文章的链接地址:

# 提取文章链接
article_link <- c()
for (i in web) {
  article_link <- c(article_link,read_html(i,endcoing = 'utf-8') %>%
                      html_nodes('h3 a') %>%
                      html_attr(name = 'href'))
}
# 查看链接数量
length(article_link)
[1100
article_link
[1"/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS__DuqHKHotGVcKQHiR-Z4kwwY1QfKXewlqXa8Fplpd9XoRtJuOp6MBQVK_yR_9CMaeLLhI87V__fDCSUKfEhxB5z1n4SQUak5sfuO8PS9XFMiSomaAUEa499pBVaNN3R4RTrtPW9nTqTeB0FFgpJiZphaafWTyrPyDp4YhXd43M7I81lMPPLX6DNlR3_F84OSHdIVqdGLBg0SJ5faQ2WZYCn9lOoZLP2Q..&type=2&query=barplot&token=02329954D2CCD14CD2D71521B94972EAD23C4E4160FD4204"
[2"/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS__DuqHKHotGVcKQHiR-Z4kwwY1QfKXewlqXa8Fplpd9B7pfJwj5jfb46f7Bk0LMqA4YWXidI6Tfj9oxUG4n_LisLAZcBskZRSK-f0T4K6vToiZtHcle1GTdGJHzvJJbdM5NEmmBE0PyRkbv47FD8lTYfypfs4iHO75FK10vTo45ADxAimrIbDOZKdKHk2f6RUkPq6wBnjWBNZZte1yqH2VOJBjQH7pCxQ..&type=2&query=barplot&token=02329954D2CCD14CD2D71521B94972EAD23C4E4160FD4204"
[3"/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS__DuqHKHotGVcKQHiR-Z4kwwY1QfKXewlqXa8Fplpd95eWIqeXemYcJBSjIp3QYfAy1F8JUWxhEF2_mX7LChUSQ6poYe90C-tXCoygifV_er0mV7hN-tdOUi8jujtkO_y1U1zZ5KCaPZIP_GygNj31JruxiIUdUzf_ibqtQWgqBpvFgkNMOOsiMpmdSMjTXQrI00nqFSBDYOO1fwzcdnUYSYTqT4eyLmA..&type=2&query=barplot&token=02329954D2CCD14CD2D71521B94972EAD23C4E4160FD4204"

可以看到获得到了这样的网址,我们查看一下 html:

可以看到是以 https://weixin.sogou.com 连接上我们获得的地址:

# 提取文章链接
web <- web[1:10]
article_link <- c()
for (i in web) {
  article_link <- c(article_link,read_html(i,endcoing = 'utf-8') %>%
                      html_nodes('h3 a') %>%
                      html_attr(name = 'href') %>%
                      paste('https://weixin.sogou.com',.,sep = ''))
}
# 查看链接数量
length(article_link)
[1100
article_link
[1"https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS__DuqHKHotGtgGWfDYDVbEwwY1QfKXewlqXa8Fplpd9XoRtJuOp6MBQVK_yR_9CMaeLLhI87V__fDCSUKfEhxB5z1n4SQUak5sfuO8PS9XFMiSomaAUEa499pBVaNN3R3mSIXnD3Pg6LktuC7V0EquaEcMqEvQvG5U1iL67PCmTcgPPEUFPf-r3PtgDfPrmQMZ5dpzLBO73QmlabCV93ciq3X8EKMKOIA..&type=2&query=barplot&token=02F08C756BA166D81217D6E380A3121F1299DCB460FD6654"
[2"https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS__DuqHKHotGtgGWfDYDVbEwwY1QfKXewlqXa8Fplpd9B7pfJwj5jfb46f7Bk0LMqA4YWXidI6Tfj9oxUG4n_LisLAZcBskZRSK-f0T4K6vToiZtHcle1GTdGJHzvJJbdP9O2B2ilbrAEVQtIlRv83ygBxwepFDAWwdIwkNU2Xji4YSkVaxMo2FrQT6kp7BJDpoP8AMwzMplnvcc-nPGPnP6zvkPgoArRQ..&type=2&query=barplot&token=02F08C756BA166D81217D6E380A3121F1299DCB460FD6654"
[3"https://weixin.sogou.com/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgS__DuqHKHotGtgGWfDYDVbEwwY1QfKXewlqXa8Fplpd95eWIqeXemYcJBSjIp3QYfAy1F8JUWxhEF2_mX7LChUSQ6poYe90C-tXCoygifV_er0mV7hN-tdOUi8jujtkO_yXgEgHaCSybhvAPBTlit5IgkOvNg3oY9BwlnNeASL2zzsdhjBRBl1n8dd609q67fG-AlJA5cEcXMZitppjHB_XI3OTRHYU2og..&type=2&query=barplot&token=02F08C756BA166D81217D6E380A3121F1299DCB460FD6654"
...

我们输入获得的网址是可以进入相应的文章的,这样就获得了每篇文章的地址。

4、获取并下载文章的图片



每个公众号的文章发表都需要一个配图,就是我们在网页里看到的,我们尝试一下把这些图片下载下来。这点也是我们这节重点学习的东西

先看看图片对应的 html 内容格式,是以 img 标记的,其图片真实的存放地址是 src 后面的东西:

我们测试一下返回内容:

# 获取图片
web[1] %>% read_html(endcoing = 'utf-8') %>% html_nodes('img') %>% html_attr(name = 'src')
[1"//img01.sogoucdn.com/net/a/04/link?appid=100520033&url=http://mmbiz.qpic.cn/mmbiz_jpg/5mt0ewv9OS0z6agn0ibpzjD4xJ78hJg1SejeHwHfn5NibPGXLuQeJSSzWia5oSPEfaVZbZ0UnSTaXXTlgrAFPGialg/0?wx_fmt=jpeg"
[2"//img01.sogoucdn.com/net/a/04/link?appid=100520033&url=http://mmbiz.qpic.cn/mmbiz_jpg/SW8c6NQiaAMbuSc9WYlOTibhHicFhHXTLZKgOicFT1RFmeQgCPAf22c29URM4cjzE4CoxnyAO1oUzkNDhx97Cr058A/0?wx_fmt=jpeg"
[3"//img01.sogoucdn.com/net/a/04/link?appid=100520033&url=http://mmbiz.qpic.cn/mmbiz_jpg/bjvWWMcEDlkIrb2NTrhHpqpyO6pUaOW28lPFxibS9qT7j7T2pI6iawjnUtyBdzOXkNviavZYze6jHk5LGib7X1mOmw/0?wx_fmt=jpeg"

一直到 &url= 后面的地址是图片的 存储地址 ,我们把后面提取出来就可以了:

# 批量获取图片地址
img_link <- c()
for (i in web) {
  img_link <- c(img_link,read_html(i,endcoing = 'utf-8') %>%
                  html_nodes('img') %>%
                  html_attr(name = 'src'))
}
# 查看图片地址数量
length(img_link)
[1100
img_link
[1"//img01.sogoucdn.com/net/a/04/link?appid=100520033&url=http://mmbiz.qpic.cn/mmbiz_jpg/5mt0ewv9OS0z6agn0ibpzjD4xJ78hJg1SejeHwHfn5NibPGXLuQeJSSzWia5oSPEfaVZbZ0UnSTaXXTlgrAFPGialg/0?wx_fmt=jpeg"
[2"//img01.sogoucdn.com/net/a/04/link?appid=100520033&url=http://mmbiz.qpic.cn/mmbiz_jpg/SW8c6NQiaAMbuSc9WYlOTibhHicFhHXTLZKgOicFT1RFmeQgCPAf22c29URM4cjzE4CoxnyAO1oUzkNDhx97Cr058A/0?wx_fmt=jpeg"
[3"//img01.sogoucdn.com/net/a/04/link?appid=100520033&url=http://mmbiz.qpic.cn/mmbiz_jpg/bjvWWMcEDlkIrb2NTrhHpqpyO6pUaOW28lPFxibS9qT7j7T2pI6iawjnUtyBdzOXkNviavZYze6jHk5LGib7X1mOmw/0?wx_fmt=jpeg"
...

# 提取地址
new_img_link <- gsub('url=','#',img_link) %>%
  strsplit(.,split = '#') %>%
  sapply(., '[',2)
new_img_link
[1"http://mmbiz.qpic.cn/mmbiz_jpg/5mt0ewv9OS0z6agn0ibpzjD4xJ78hJg1SejeHwHfn5NibPGXLuQeJSSzWia5oSPEfaVZbZ0UnSTaXXTlgrAFPGialg/0?wx_fmt=jpeg"
[2"http://mmbiz.qpic.cn/mmbiz_jpg/SW8c6NQiaAMbuSc9WYlOTibhHicFhHXTLZKgOicFT1RFmeQgCPAf22c29URM4cjzE4CoxnyAO1oUzkNDhx97Cr058A/0?wx_fmt=jpeg"
[3"http://mmbiz.qpic.cn/mmbiz_jpg/bjvWWMcEDlkIrb2NTrhHpqpyO6pUaOW28lPFxibS9qT7j7T2pI6iawjnUtyBdzOXkNviavZYze6jHk5LGib7X1mOmw/0?wx_fmt=jpeg"
...

得到图片的地址了接下来直接下载就行了,1 分钟不到就下载完了:

# 新建图片储存文件夹
dir.create('C:\\Users\\admin\\Desktop\\pic_download')

# 批量下载
for (i in 1:length(new_img_link)) {
  pic_name <- paste('C:\\Users\\admin\\Desktop\\pic_download\\',i,'.jpg',sep = '')
  download.file(url = new_img_link[i],
                destfile = pic_name,
                method = "curl")
}
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 36545  100 36545    0     0  36545      0  0:00:01 --:--:--  0:00:01  228k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 27745  100 27745    0     0  27745      0  0:00:01 --:--:--  0:00:01  288k
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
...

我们去文件夹打开看看成果!

数量也是 100 张,不错不错:




最后发现一个问题,就是 SelectorGadget 在公众号文章里面是打不开的,不知道为什么。所以今天你学习了吗?


发现更多精彩

关注公众号

欢迎小伙伴留言评论!

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,打赏一下吧!

推 荐 阅 读




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存