听说你在网上斗图斗输了?听说你连斗图用的弔图也不知道去哪找?
没事啦,你看到这篇文章就证明你找到救星啦!在本篇文章里我会带着大家一起来爬取一下表情包网,从此让你的图库再也不缺弔图,妈妈再也不担心我斗图找不到图啦!那废话不多说 直接上解析。
首先我们要知道如果我们要爬取一个网站,我们要先分析这个网站,了解你的需求是什么。我这边大致也把需求分为了以下几大点:1、网站分析 2、对要爬取的图片分析 3、单页爬虫代码的编写 4、翻页爬取的处理。那我们首先从第一点网站分析来说。
- 网站分析
待爬取url:http://www.bbsnet.com/biaoqingbao/page/1
我们先来分析一下这个网站我们要爬取的东西是静态的还是动态的。通过下图我们可以看到我们要找的东西是在网页源代码里面可以找到的,那证明这个网站是属于静态加载的网站了。我们不需要通过寻找数据接口去爬取,直接使用普通的爬虫代码进行爬取就可以了。
2. 爬取图片分析
由于上文已经说了,我们爬取的网站是属于静态的网站,所以我们需要寻找的相对应的数据也都是在网页源代码中。如下图所示,我们直接通过检查可以很清楚的看到我们要的数据就是img标签里面的src属性,所以我们这里直接提取这个标签的属性就可以得到图片的链接了。
3、上述分析结束了那我们也就可以开始先写爬取一页表情包的代码了,代码如下:
'''
提示:
本次爬取使用到的库有requests,lxml
安装方法:win+R pip install xxx(需要安装的库)
'''
import requests
from lxml import etree
class BqbSpider(object):
def __init__(self):
self.header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
self.name = 1
def get(self, url):
res = requests.get(url, headers=self.header)
html = res.content.decode('utf-8')
return html
def parse_picture(self, html):
tree = etree.HTML(html)
li_lst = tree.xpath('//ul[@id="post_container"]/li')
img_lst = []
for li in li_lst:
img_url = li.xpath('./div/a/img/@src')
for img in img_url:
img_lst.append(img)
return img_lst
def save(self, img_lst):
for img in img_lst:
response = requests.get(img)
filename = './img/表情{}.png'.format(self.name)
print('正在爬取第{}张表情包'.format(self.name))
with open(filename, 'wb') as f:
f.write(response.content)
self.name += 1
def main(self):
url = 'http://www.bbsnet.com/biaoqingbao'
html = self.get(url)
img_lst = self.parse_picture(html)
self.save(img_lst)
if __name__ == '__main__':
b = BqbSpider()
b.main()
看完了单页爬取后是不是觉得自己的弔图瞬间比以前多了那么几张呢?什么?你说不够多?那没关系啊,我们再接着来说说翻页爬取,让你从此以后再也不缺图~
4、翻页爬取处理
要做翻页处理,最直观的方法就是直接观察不同页的url变化了,通过点击网页最底部的下一页按钮我们可以观察到(下面的代码框里)
第二页:http://www.bbsnet.com/biaoqingbao/page/2
第三页:http://www.bbsnet.com/biaoqingbao/page/3
根据上面的两个url规律我们可以知道如果说是翻页操作的话变化的地方只有page/(数字)后面这个数字,并且是以+1的形式去加的,所以我们就可以推断出第一页的url是:
第一页:http://www.bbsnet.com/biaoqingbao/page/1
那么知道了第一页的url后我们相对应的也就可以把我们上面单页爬取的起始url改写成如下的写法
url = 'http://www.bbsnet.com/biaoqingbao/page/{}'.format()
通过点击尾页我们可以观察到这个网站的表情包一共是有13页,所以这里我们就可以写个遍历以此来实现翻页功能
我们再把改写的url和这个遍历结合一下,就可以得到一个完整的翻页url(如下)
for i in range(1, 14):
url = 'http://www.bbsnet.com/biaoqingbao/page/{}'.format(i)
说到这里了,有个问题我需要跟大家提醒一下,就是有可能你的爬虫文件在运行途中会突然报错。在爬取到第101个图片文件的时候会报这么个错误,当时我也很纳闷什么问题=。=,直到后来我去网页里面看了一眼,才知道原来是这张图片它里面本来就是没东西的(就是图2里面的那个斗图神器)
1、
2、
我们点开这个斗图神器也是可以看到他里面是没东西的,所以我们这里就需要一个判断来跳过他以此保证爬虫文件能够正常的运行(代码如下)
for img in img_lst:
if img == 'https://ws4.sinaimg.cn/large/9150e4e5gy1fs57bizowvg20dc0ehmyd.gif':
continue
else:
response = requests.get(img)
filename = './img/表情{}.png'.format(self.name)
print('正在爬取第{}张表情包'.format(self.name))
with open(filename, 'wb') as f:
f.write(response.content)
self.name += 1
以上就是对表情包网站的爬取的全部分析,下面是完整代码:
'''
提示:
本次爬取使用到的库有requests, lxml
安装方法:win+R pip install xxx(需要安装的库)
'''
import requests
from lxml import etree
class BqbSpider(object):
def __init__(self):
self.header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
self.name = 1
def get(self, url):
res = requests.get(url, headers=self.header)
html = res.content.decode('utf-8')
return html
def parse_picture(self, html):
tree = etree.HTML(html)
li_lst = tree.xpath('//ul[@id="post_container"]/li')
img_lst = []
for li in li_lst:
img_url = li.xpath('./div/a/img/@src')
for img in img_url:
img_lst.append(img)
# print(img_lst)
return img_lst
def save(self, img_lst):
for img in img_lst:
if img == 'https://ws4.sinaimg.cn/large/9150e4e5gy1fs57bizowvg20dc0ehmyd.gif':
continue
else:
response = requests.get(img)
filename = './img/表情{}.png'.format(self.name)
print('正在爬取第{}张表情包'.format(self.name))
with open(filename, 'wb') as f:
f.write(response.content)
self.name += 1
def main(self):
# 用于翻页爬取
for i in range(1, 14):
url = 'http://www.bbsnet.com/biaoqingbao/page/{}'.format(i)
html = self.get(url)
img_lst = self.parse_picture(html)
self.save(img_lst)
if __name__ == '__main__':
b = BqbSpider()
b.main()
至此就是本篇文章的所有内容,有不足之处请多多指出。