如何通过 python 实现一个 正经 tumblr 爬虫

发布于 2025-02-24 15:02:34 字数 2426 浏览 6 评论 0

直接入正题,写一个 python 爬虫,最重要的其实是找到入口,从哪里开始爬,以 tumblr 为例,只要能够获取到用户列表,通过每个用户的主页就能拿到每个用户发的或者转发的视频,原作者的名字也可以拿到。

代码如下:


def download(self, url):
# 用 requests 库获取 url 的网页内容
res = requests.get(url)
# 用 bs4 解析 html
soup = BeautifulSoup(res.text)
# 获取 iframe 标签列表
iframes = soup.find_all('iframe')
tmp_source = []
for i in iframes:
# 获取视频地址
source = i.get('src', '').strip()
# 过滤内容
if source and source.find('https://www.tumblr.com/video') != -1 and source not in self.total_url:
tmp_source.append(source)
print u'新增链接:' + source

tmp_user = []
# 获取用户列表
new_users = soup.find_all(class_='reblog-link')
for user in new_users:
username = user.text.strip()
# 过滤用户
if username and username not in self.total_user:
# 将用户放入待爬取队列
self.user_queue.put(username)
# 加入总用户列表中
self.total_user.append(username)
tmp_user.append(username)
print u'新增用户:' + username

为了提高爬虫的性能,可以采用多线程的方式,代码如下

class Tumblr(threading.Thread):

def run(self):
# 为了能处理多线程 ctr+c 的信号问题,具体见完整代码
global is_exit
while not is_exit:
user = self.user_queue.get()
url = 'http://%s.tumblr.com/' % user
self.download(url)
time.sleep(2)


def main():
# 线程数
NUM_WORKERS = 10
# 待爬取队列
queue = Queue.Queue()
# 开始的时候将一个热门博主的 username 加入到待爬取队列
queue.put('username')
for i in range(NUM_WORKERS):
# 实例化线程对象
tumblr = Tumblr(queue)
# 设置线程为守护线程
tumblr.setDaemon(True)
tumblr.start()

最后将用户和视频资源写入到文件中

# 由于多线程写文件会出现线程安全问题,所以加了个线程锁
mutex.acquire()
if tmp_user:
self.f_user.write('\n'.join(tmp_user)+'\n')
if tmp_source:
self.f_source.write('\n'.join(tmp_source)+'\n')
# 释放锁
mutex.release()

这样一个多线程 python 爬虫就基本完成了,完整代码见 github

最后声明这是一个正经的爬虫(严肃脸),爬取的资源跟你第一个填入的 username 有很大关系,老司机怎么开车我不管。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
29 人气
更多

推荐作者

闻呓

文章 0 评论 0

深府石板幽径

文章 0 评论 0

mabiao

文章 0 评论 0

枕花眠

文章 0 评论 0

qq_CrTt6n

文章 0 评论 0

红颜悴

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文