背景
发现最近跟不上网络时代了
我竟然连斗图都斗不过别人…岂有此理!
不就是图片么,电脑可以解决的都不是事,想到可以用爬虫去爬取图片,那么开搞!
分析url
众所周知,百度贴吧是表情包最多个地方,那么我就从百度贴吧入手。
URL:https://tieba.baidu.com/f?ie=utf-8&kw=%E8%A1%A8%E6%83%85%E5%8C%85&fr=search
先从这个url入手,看到这么多【%】,几乎是url加密,先去解码一下。
【?】问号后面的是参数,“ie=uft-8” 页面编码 “kw=表情包” 是贴吧的搜索,“fr=search” 意思是来至于搜索
简化一下这个URL还是能正常搜索的。
https://tieba.baidu.com/f?kw=%E8%A1%A8%E6%83%85%E5%8C%85
然后就是找页面内的url,这里我用的是 xpach 插件搜索出 a 标签的地址 href。(需要小伙伴去查看一下xpach的语法)
还要获取下一页地址的url
代码实现
import requests
from lxml import etree
import json
class Tieba:
def __init__(self,name):
self.url = "https://tieba.baidu.com/f?kw="+name
self.home = "https://tieba.baidu.com"
self.page = 1
self.name = "tieba_"+name
def get_url_list(self,html_str): #获取URL构成列表
content_list = []
html = etree.HTML(html_str)
next_url = html.xpath("//a[(@class='next pagination-item ')]/@href")[0] if len(html.xpath("//a[(@class='next pagination-item ')]/@href"))>0 else None
node_list = html.xpath("//a[contains(@class, 'j_th_tit')]") #每一页的所有url节点
print("第" + str(self.page) + "页url")
for node in node_list:
content = {"url":self.home+node.xpath("./@href")[0],
"title":node.xpath("./@title")}
print(content)
content_list.append(content)
if next_url is None:
print("已经搜索到最后一页了")
return content_list, next_url
print("下一页url:"+"https:"+next_url)
self.page = self.page+1
return content_list,"https:"+next_url
def parse_url(self,url): #发送请求
res = requests.get(url)
return res.content.decode()
def sava_content(self,content_list): #保存在本地
with open(self.name+".txt","a",encoding="UTF-8") as f:
for content in content_list:
f.write(json.dumps(content,ensure_ascii=False))
f.write("\n")
def run(self):
next_url = self.url
while next_url is not None:
html_str = self.parse_url(next_url)
content_list,next_url = self.get_url_list(html_str)
self.sava_content(content_list)
if __name__=='__main__':
name = "表情包" #所要爬取贴吧的名字
t = Tieba(name)
t.run()
结尾
这期是简单的获取到 url 保存在本地,下一期再开始爬取图片内容。这个脚本算是的认识爬虫用的,简略了很多东西,甚至连请求头部都不伪造。最多最多只能算是一个爬虫的入门篇。