严正声明:爬虫应严格遵守国家的相关法律法规,坚决做一只文明爬虫
前言
还在为表情包不够用而烦恼吗?
还在为表情包单一而苦恼吗?
还在为聊天的枯燥乏味而忧愁吗?
今天就让刚学习爬虫0.01天的小菜鸟为您奉上表情包大餐吧!
首先我们先了解一下爬虫的基本流程(小菜鸟理解):
- 锁定需求,搜索网址
- 分析网页,解析方法
- 仔细思考,数据保存
- 仔细测试,代码实现
- (程序优化,效率提高)
- 代码封装,较优体现
一、知识准备
- 基础知识列表
- 准备工具
二、功能解析与实现
1.引入库
-
requests 用于对网页发起请求
-
lxml 用于网页的解析利用标签进行定位和获取
-
os 在最后处理图片时使用,拿取后缀
代码如下:
import os
import requests
from lxml import etree
2.请求准备
代码如下
# 搜索到的符合需求的网址
url="爬取的网址"
# 爬虫伪装---在网页Request headers中有我们想要的参数---由于网站简单无需进行更多伪装
headers={
'user-agent':'...' # 此网站只需ua即可爬取
}
为什么要进行伪装呢?
首先我们先要了解一下我们搜索网址并且进入网站时我们会携带什么:
访问者的ip地址、访问者的user-agent、访问者的host…(具体查看可以到访问的网站的Requests Headers中查看)
而爬虫直接访问网站会携带什么呢?爬虫标志
而网站很容易就可以辨别爬虫然后拒绝爬虫的访问——反爬
(网站反爬还有很多的措施技术,这里只是片面的了解一下反爬)
然后回归正题,将上网者携带的信息让爬虫带上不就好了嘛。
3.发起请求
网站请求方式以get和post为主,根据网站的要求选择不同的请求方式。
代码如下
response=requests.get(url,headers=headers)
print(response)
# 如果此处得到的是[response<200>]即请求成功
4.数据解析
代码如下
html=etree.HTML(response.text)
# 数据列表
data_list = html.xpath('//*[@id="app"]/div[1]/div/div[1]//div') # xpath语法
# 列表取值--遍历
for data in data_list[1:]: # 索引从1开始可从网站上观察而得
img_list = data.xpath('./a/div//img') # 层层解析
for imag in img_list:
imag_url = "https:" + imag.xpath('@src')[0] # 拿到图片网址
5.数据保存
代码如下
# 图片名称简单表示
idx=1
# 数据保存---文件名+数据保存方式
with open('./image/第%d张' % idx + os.path.splitext(imag_url)[-1], 'wb') as file:
resp = requests.get(imag_url, headers=headers).content # 图片二进制码保存
file.write(resp)
idx+=1
print("第%d张保存成功"%idx)
6.成果展示
图片在这里哦(这里只是简单展示哦)
三、普通代码展示
代码如下(这里只抓取了第一页的数据哦)
import os.path
import requests
from lxml import etree
# 网页准备,伪装
url = '...'
headers = {
'user-agent': '...'
}
# 发起请求
response = requests.get(url, headers=headers)
# 数据解析
html = etree.HTML(response.text)
data_list = html.xpath('//*[@id="app"]/div[1]/div/div[1]//div')
idx = 0
for data in data_list[1:]:
img_list = data.xpath('./a/div//img')
for imag in img_list:
imag_url = "https:" + imag.xpath('@src')[0]
# 数据保存
with open('./image/第%d张' % idx + os.path.splitext(imag_url)[-1], 'wb') as file:
resp = requests.get(imag_url, headers=headers).content
file.write(resp)
idx += 1
print('第%d张保存成功' % idx)
# 程序结束提醒
print('保存成功')
四、封装代码展示
import os
import requests
from lxml import etree
class Emojis(object):
def __init__(self):
self.url = '...'
self.headers = {
'user-agent': '...'
}
self.idx = 1
def send_request(self, url):
resp = requests.get(url, headers=self.headers)
if resp.status_code == 200:
return resp.text
else:
return None
def analysis(self, resp):
html = etree.HTML(resp)
data_list = html.xpath('//*[@id="app"]/div[1]/div/div[1]//div')
for data in data_list[1:]:
img_list = data.xpath('./a/div//img')
for imag in img_list:
imag_url = "https:" + imag.xpath('@src')[0]
self.save(imag_url)
def save(self, img_url):
with open('./image/%d' % self.idx + os.path.splitext(img_url)[-1], 'wb') as file:
resp = requests.get(img_url, headers=self.headers).content
file.write(resp)
print("第%d张保存成功!" % self.idx)
self.idx += 1
def run(self):
n=int(input("请输入想要爬取的页数:"))
for num in range(1, n):
resp = self.send_request(self.url.format(num))
if len(resp) == 0:
print("你已经被反爬了!")
else:
self.analysis(resp)
if __name__ == '__main__':
spider = Emojis()
spider.run()
具体网址想要的小伙伴可以私信我哦——网站隐私不便于透露
总结
本文简单实现了使用Python工具,利用xpath解析方法爬取某表情包网站的程序,欢迎热爱爬虫的小伙伴们一起学习交流呀。
第一次写拉么长的博客┭┮﹏┭┮加之语言表达能力有限,希望各位大佬们对我的文章进行友好批判和指导┭┮﹏┭┮。