今天啥也没干,大吃了几顿。

一直打算做下书影标记(无论最后形式是啥,哪怕用 txt 记录…),恰好这几天执行力异常地高,说做就做。

先基本搭了个页面,然后需要数据。打算把豆瓣上的标记取回来。

话说什么时候这些社区网站才能完全实现把用户的数据打包提供给用户啊…

写了个小爬虫,说起来我尝试过几次简单地爬东西,都是基于第一次写的那段代码…稍微改改就行了,效率真高啊…

获取的是标记列表的信息,并没有进入详情页爬取…(因为没做过…人嘛,总是倾向于熟悉的方式…)而且现在的信息似乎够用了…再说吧。

因为挺简单的,顺便把代码也贴上…

环境 python3

#!/usr/local/bin/python3.6
# encoding:utf-8
# 注释使用中文引入
from bs4 import BeautifulSoup
import requests
import time
import sys
import importlib
importlib.reload(sys)
# utf-8 编码问题

# 配置
user = 'hqweay'  # 豆瓣 id
page_end = 600  # 要爬多少条数据
file_name = "douban.txt"  # 数据保存文件名
sleep_time = 500  # 爬取频率
#
id = 0  # 计数
page = -15
# --------------------------
fo = open(file_name, "wb+")  # 数据写入文件 "ab+"追加,"wb+"覆盖  b 是二进制使用数据的意思
print('开始爬取...')
# 爬虫
while True:
    # 15 为一组,值为 0~15 取得同一页数据
    page += 15
    # URL
    url_str = 'https://movie.douban.com/people/' + user + '/collect?start=' + \
        str(page) + '&sort=time&rating=all&filter=all&mode=grid'
    # 获取信息
    response = requests.get(url=url_str)

    info_html = response.text

    soup = BeautifulSoup(info_html, 'html.parser')

    tag = soup.div

    movieList = soup.find_all("div", "item")  # 一页所有电影

    # 解析...
    for movie in movieList:
        id += 1
        movieItem = BeautifulSoup(str(movie), 'html.parser')
        pic = movieItem.find("div", "pic").find('img')['src']
        title = movieItem.find("li", "title").find('a').get_text()
        url = movieItem.find("li", "title").find('a')['href']
        intro = movieItem.find("li", "intro").get_text()
        date = movieItem.find_all("li")[2].get_text()  # 3 is comment
        comment = ""
        commentItem = movieItem.find_all("li")
        if len(commentItem) > 3:
            comment = commentItem[3].get_text()

        print("" + str(id) + "条数据...")
        # 写入
        fo.write(
            (
                '{\n"id" : "' + str(id) + '",' +
                '\n"url" : "' + str(url.replace("\n", "").replace(" ", "")) + '",' +
                '\n"pic" : "' + str(pic.replace("\n", "").replace(" ", "")) + '",' +
                '\n"title" : "' + str(title.replace("\n", "").replace(" ", "")) + '",' +
                '\n"intro" : "' + str(intro.replace("\n", "").replace(" ", "")) + '",' +
                '\n"date" : "' + str(date.replace("\n", "").replace(" ", "")) + '",' +
                '\n"comment" : "' + str(comment.replace("\n", "").replace(" ", "").replace('"', '\'')) + '"\n},\n').encode('UTF-8')
        )
    # exit
    if page_end == page:
        fo.close()
        break

得到数据去掉最后的英文符逗号,再在前后加上 ‘[’ 与 ‘]',就是标准 json 格式了…

PS : 豆瓣条目虽然和谐地厉害,也过审过成人视频的条目…遇到过一个 ACG 站,里站的内容已经敏感到家了,仍然禁止讨论一些东西。有些东西的敏感级别高到可怕…

异想天开能不能用 js 写,那么就可以直接在浏览器获取自己的数据了…结果遇到跨域问题,也没深究,大概不行吧。

不过应该能用油猴插件的形式获取吧。

// [update-2019-06-11]

直接写入 json 到本地

#!/usr/local/bin/python3.6
# encoding:utf-8
# 注释使用中文引入
from bs4 import BeautifulSoup
import requests
import time
import sys
import importlib
import json
importlib.reload(sys)
# utf-8 编码问题

# 配置
page_end = 100000  # 要爬多少条数据
# page_end = (page_end/15 + 1) * 15
id = 0  # 计数
user = 'hqweay'  # 豆瓣 id
file_name = "./douban-" + user + ".json"  # 数据保存文件名
sleep_time = 700  # 爬取频率
page = -15
# --------------------------
fo = open(file_name, "w+")  # 数据写入文件 "ab+"追加,"wb+"覆盖  b 是二进制使用数据的意思
print('开始爬取...')
datas = []
item = {
    "url": "https://movie.douban.com/subject/1297052/",
    "pic": "https://img3.doubanio.com/view/photo/s_ratio_poster/public/p456692072.jpg",
    "name": "侧耳倾听/耳をすませば/心之谷/梦幻街少女",
    "intro": "1995-07-15(日本)/本名阳子/小林桂树/高山南/高桥一生/山下容莉枝/室井滋/露口茂/饭冢雅弓/加利·艾尔维斯/日本/近藤喜文/111分钟/侧耳倾听/剧情/爱情/动画/宫崎骏HayaoMiyazaki/柊葵AoiHîragi/日语/英语",
    "date": "2019-05-31",
    "comment": "干净得像猫爪一样/中学英语课本接触的乡村路",
    "oldTags": ["吉卜力", "宫崎峻", "日本", "日本动画"]
}
# 爬虫
while True:

    # 15 为一组,值为 0~15 取得同一页数据
    page += 15
    # URL
    url_str = 'https://movie.douban.com/people/' + user + '/collect?start=' + \
        str(page) + '&sort=time&rating=all&filter=all&mode=grid'
    # 获取信息
    response = requests.get(url=url_str)
    info_html = response.text
    soup = BeautifulSoup(info_html, 'html.parser')
    tag = soup.div
    movieList = soup.find_all("div", "item")  # 一页所有电影

    print(response)

    if(0 == len(movieList)):
        break
    # 测试
    # if(page > 30):
    #     break

    # 解析...
    for movie in movieList:
        id += 1
        movieItem = BeautifulSoup(str(movie), 'html.parser')
        pic = movieItem.find("div", "pic").find('img')['src']
        title = movieItem.find("li", "title").find('a').get_text()
        url = movieItem.find("li", "title").find('a')['href']
        intro = movieItem.find("li", "intro").get_text()
        date = movieItem.find("span", "date").get_text()

        tags = ""
        if movieItem.find("span", "tags") != None:
            tags = movieItem.find("span", "tags").get_text()

        comment = ""
        if movieItem.find("span", "comment") != None:
            comment = movieItem.find("span", "comment").get_text()

        tags = tags.replace("标签: ", "")  # 去掉前缀
        tags = tags.split(" ")  # 按空格转为数组

        if len(tags) == 1:
            del tags[0]

        print("" + str(id) + "条数据...")

        # item['id'] = str(id)
        item['name'] = str(title.replace("\n", "").replace(" ", ""))
        item['url'] = str(url.replace("\n", "").replace(" ", ""))
        item['pic'] = str(pic.replace("\n", "").replace(" ", ""))
        item['intro'] = str(intro.replace("\n", "").replace(" ", ""))
        item['date'] = str(date)
        item['comment'] = str(comment.replace(
            "\n", "").replace(" ", "").replace('"', '\''))
        item['oldTags'] = str(tags)

        newItem = item.copy()
        datas.append(newItem)


itemJson = json.dumps(datas, ensure_ascii=False)
fo.write(itemJson)
fo.close()