你们想要的 Tumblr 爬虫

2016-10-28 23:58:30 +08:00
 tumbzzc

好几个月前写的了,写的比较挫。
并没有写成爬取一个博客的所有内容,本来是用来网站的,如果要爬所有内容,会让用户等待太久。

# -*- coding=utf-8 -*-
from threading import Thread
import Queue
import requests
import re
import os
import sys
import time


api_url='http://%s.tumblr.com/api/read?&num=50&start='
UQueue=Queue.Queue()
def getpost(uid,queue):
    url='http://%s.tumblr.com/api/read?&num=50'%uid
    page=requests.get(url).content
    total=re.findall('<posts start="0" total="(.*?)">',page)[0]
    total=int(total)
    a=[i*50 for i in range(1000) if i*50-total<0]
    ul=api_url%uid
    for i in a:
        queue.put(ul+str(i))


extractpicre = re.compile(r'(?<=<photo-url max-width="1280">).+?(?=</photo-url>)',flags=re.S)   #search for url of maxium size of a picture, which starts with '<photo-url max-width="1280">' and ends with '</photo-url>'
extractvideore=re.compile('/tumblr_(.*?)" type="video/mp4"')

video_links = []
pic_links = []
vhead = 'https://vt.tumblr.com/tumblr_%s.mp4'

class Consumer(Thread):

    def __init__(self, l_queue):
        super(Consumer,self).__init__()
        self.queue = l_queue

    def run(self):
        session = requests.Session()
        while 1:
            link = self.queue.get()
            print 'start parse post: ' + link
            try:
                content = session.get(link).content
                videos = extractvideore.findall(content)
                video_links.extend([vhead % v for v in videos])
                pic_links.extend(extractpicre.findall(content))
            except:
                print 'url: %s parse failed\n' % link
            if self.queue.empty():
                break


def main():
    task=[]
    for i in range(min(10,UQueue.qsize())):
        t=Consumer(UQueue)
        task.append(t)
    for t in task:
        t.start()
    for t in task:
        t.join
    while 1:
        for t in task:
            if t.is_alive():
                continue
            else:
                task.remove(t)
        if len(task)==0:
            break


def write():
    videos=[i.replace('/480','') for i in video_links]
    pictures=pic_links
    with open('pictures.txt','w') as f:
        for i in pictures:
            f.write('%s\n'%i)
    with open('videos.txt','w') as f:
        for i in videos:
            f.write('%s\n'%i)


if __name__=='__main__':
    #name=sys.argv[1]
    #name=name.strip()
    name='mzcyx2011'
    getpost(name,UQueue)
    main()
    write()
18169 次点击
所在节点    Python
52 条回复
miketeam
2016-10-28 23:59:59 +08:00
Mark
tumbzzc
2016-10-29 00:14:18 +08:00
忘了去重了!在 write 函数里面
videos=list(set(videos))
pictures=list(set(pictures))
sammiriam
2016-10-29 01:08:48 +08:00
mark ,明天起来再看
wjm2038
2016-10-29 01:15:12 +08:00
mark
weipang
2016-10-29 06:22:08 +08:00
然而不会用
cszhiyue
2016-10-29 07:58:37 +08:00
tumbzzc
2016-10-29 09:06:11 +08:00
@cszhiyue Python 下载没多少意义,下载起来慢。所以我是写出文件,可以用迅雷下载
aksoft
2016-10-29 09:17:48 +08:00
刚需啊,出售营养快线!
tumbzzc
2016-10-29 09:29:49 +08:00
@weipang 改个 name 就够了,然后直接运行
tumbzzc
2016-10-29 09:32:50 +08:00
@aksoft 个人网站上目前有 5000 多个解析过的博客😝
liuxingou
2016-10-29 09:35:29 +08:00
@tumbzzc

正解,解析出地址,让下载工具下载,最高效率了。
aksoft
2016-10-29 09:42:02 +08:00
@tumbzzc 哪呢
programdog
2016-10-29 09:53:59 +08:00
感谢楼主
tumbzzc
2016-10-29 10:01:52 +08:00
@aksoft 最下面
freaks
2016-10-29 10:06:58 +08:00
这样的在线解析不要太多(⊙o⊙)哦!😂
0915240
2016-10-29 10:13:11 +08:00
olddrivertaketakeme
Nicksxs
2016-10-29 10:23:13 +08:00
不是被墙了么, vps 上下吗
cszhiyue
2016-10-29 10:49:04 +08:00
@tumbzzc 开了 8 进程下载并不觉得慢啊。 是什么理由导致慢呢?
exoticknight
2016-10-29 10:51:17 +08:00
这东西是好,但是我觉得爬出提供资源的 tumblr 名字更重要
tumbzzc
2016-10-29 10:53:20 +08:00
@freaks 我的网站放在过外 vps 上,也是在线解析

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/316337

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX