Beispiel #1
0
def get_time_and_title(blog_url, author_page_parse):
    print("准备从归档页面获取时间", end="    ")
    public_time = ""
    author_url = blog_url.split("/post")[0]
    archive_url = author_url + "/dwr/call/plaincall/ArchiveBean.getArchivePostByTime.dwr"
    author_id = author_page_parse.xpath(
        "//body/iframe[@id='control_frame']/@src")[0].split("blogId=")[1]
    data = l4_author_img.make_data(author_id, 50)
    header = l4_author_img.make_head(author_url)
    blog_id = blog_url.split("/")[-1]
    flag = False
    the_blog_info = ""
    while True:
        page_data = l4_author_img.post_content(url=archive_url,
                                               data=data,
                                               head=header)
        # 正则匹配出每条博客的信息
        blogs_info = re.findall(r"s[\d]*.blogId.*\n.*\n", page_data)
        # 循环每条,找到匹配的信息
        for blog_info in blogs_info:
            if blog_id in blog_info:
                the_blog_info = blog_info
                flag = True
                break
        if flag:
            break
        # # 当返回的博客数不等于请求参数中的query_num时说明已经获取到所有的博客信息,跳出循环
        # if not len(blogs_info) == 50:
        #     break
        # 正则匹配本页最后一条博客信息的时间戳,用于下个请求data中的参数
        data['c0-param2'] = 'number:' + str(
            re.search('s%d\.time=(.*);s.*type' % (50 - 1), page_data).group(1))
        time.sleep(random.randint(1, 2))

    # 用正则匹配出标题和时间戳并格式化
    timestamp = re.search(r's[\d]*.time=(\d*);', the_blog_info).group(1)
    public_time = time.strftime("%Y-%m-%d",
                                time.localtime(int(int(timestamp) / 1000)))
    title = re.findall(r'[\d]*.title="(.*?)"', the_blog_info)[0]
    title = title.encode('latin-1').decode('unicode_escape')
    if public_time:
        print("已获取到时间")
    else:
        print("未获取到博客 %s 的发布时间" % blog_url)
    if title:
        print("获取到标题{}".format(title))
    return [public_time, title]
Beispiel #2
0
def parse_archive_page(url, header, data, author_url, author_name, query_num, start_time, end_time):
    all_blog_info = []

    while True:
        print("获取归档页面信息,当前请求的时间戳参数为 %s" % data["c0-param2"])
        page_data = l4_author_img.post_content(url=url, data=data, head=header)
        # 正则匹配出每条博客的信息并增加到数组all_blog_info
        # new_blogs_info = re.findall(r"s[\d]*.blogId.*\n.*noticeLinkTitle", page_data)
        new_blogs_info = re.findall(r"s[\d]*.blogId.*\n.*\n", page_data)
        all_blog_info += new_blogs_info
        # 当返回的博客数不等于请求参数中的query_num时说明已经获取到所有的博客信息,跳出循环
        if not len(new_blogs_info) == query_num:
            break
        # 如果设定了开始时间,且最后一个时间戳小于设定的时间,跳出循环
        if start_time:
            if l4_author_img.is_stamp_early(data["c0-param2"].split(":")[1], start_time):
                break
        # 正则匹配本页最后一条博客信息的时间戳,用于下个请求data中的参数
        data['c0-param2'] = 'number:' + str(re.search('s%d\.time=(.*);s.*type' % (query_num - 1), page_data).group(1))
        time.sleep(random.randint(1, 2))

    # 过滤和整理博客信息,整理后每条结构为{"url": "http://***","time": "20**-**-**","img_url": "http://***"}
    parsed_blog_info = []
    blog_num = 0
    for blog_info in all_blog_info:
        # 时间戳
        timestamp = re.search(r's[\d]*.time=(\d*);', blog_info).group(1)
        # 只爬取设定时间内,时间线时从新到旧,如果早于该时间则直接跳出循环,如果晚于则跳过这一次循环,没有设定则全部爬取。
        if start_time:
            if l4_author_img.is_stamp_early(timestamp, start_time):
                break
        if end_time:
            if l4_author_img.is_stamp_late(timestamp, end_time):
                continue
        blog_info_dic = {}
        blog_num += 1

        # 博客的编号 比如https://lindujiu.lofter.com/post/423a9c_1c878d5e6 的 423a9c_1c878d5e6
        blog_index = re.search(r's[\d]*.permalink="(.*?)";', blog_info).group(1)
        blog_info_dic["url"] = author_url + "post/" + blog_index

        # 获取标题
        title = ""
        # 获取标题,纯文本博客会获取一个空标题,图片博客没有标题,确认文本有效后弄个临时标题(这里的文本内容并不会用到后面)
        re_title = re.findall(r'[\d]*\.title="(.*?)";', blog_info)
        re_content = re.findall(r'[\d]*\.content="(.*?)";', blog_info)
        # 这个判断总觉得有点问题
        if re_title and re_title[0]:
            title = re_title[0].encode('latin-1').decode('unicode_escape')
            blog_info_dic["blog_type"] = "article"
        elif re_content:
            # 没有标题的纯文本信息,先弄一个临时title
            blog_info_dic["blog_type"] = "text"
            title = "tmp_title"
        else:
            # 没有title就直接跳过后面的解析
            continue

        # 博客的编号 比如https://lindujiu.lofter.com/post/423a9c_1c878d5e6 的 423a9c_1c878d5e6
        blog_index = re.search(r's[\d]*.permalink="(.*?)";', blog_info).group(1)
        blog_info_dic["url"] = author_url + "post/" + blog_index

        # 获取时间
        time_local = time.localtime(int(int(timestamp) / 1000))
        dt_time = time.strftime("%Y-%m-%d", time_local)
        # public_time = time.strftime("%Y-%m-%d", time.localtime(int(int(timestamp) / 1000)))
        blog_info_dic["time"] = dt_time
        if blog_info_dic["blog_type"] == "text":
            title = "{} {}".format(author_name, dt_time)
        blog_info_dic["title"] = title
        blog_info_dic["print_title"] = blog_info_dic["title"].encode("gbk", errors="replace").decode("gbk",
                                                                                                     errors="replace")

        parsed_blog_info.append(blog_info_dic)

    print("归档页面解析完毕,共获取博客链接数%d,文本与文章篇数%d" % (blog_num, len(parsed_blog_info)))
    return parsed_blog_info
Beispiel #3
0
def parse_archive_page(url, header, data, author_url, query_num, start_time,
                       end_time, target_titles, merger_chapter):
    all_blog_info = []

    while True:
        print("获取归档页面信息,当前请求的时间戳参数为 %s" % data["c0-param2"])
        page_data = l4_author_img.post_content(url=url, data=data, head=header)
        # 正则匹配出每条博客的信息并增加到数组all_blog_info
        # new_blogs_info = re.findall(r"s[\d]*.blogId.*\n.*noticeLinkTitle", page_data)
        new_blogs_info = re.findall(r"s[\d]*.blogId.*\n.*\n", page_data)
        all_blog_info += new_blogs_info
        # 当返回的博客数不等于请求参数中的query_num时说明已经获取到所有的博客信息,跳出循环
        if not len(new_blogs_info) == query_num:
            break
        # 如果设定了开始时间,且最后一个时间戳小于设定的时间,跳出循环
        if start_time:
            if l4_author_img.is_stamp_early(data["c0-param2"].split(":")[1],
                                            start_time):
                break
        # 正则匹配本页最后一条博客信息的时间戳,用于下个请求data中的参数
        data['c0-param2'] = 'number:' + str(
            re.search('s%d\.time=(.*);s.*type' %
                      (query_num - 1), page_data).group(1))
        time.sleep(random.randint(1, 2))

    # 过滤和整理博客信息,整理后每条结构为{"url": "http://***","time": "20**-**-**","img_url": "http://***"}
    parsed_blog_info = []
    blog_num = 0
    for blog_info in all_blog_info:
        # 时间戳
        timestamp = re.search(r's[\d]*.time=(\d*);', blog_info).group(1)
        # 只爬取设定时间内,时间线时从新到旧,如果早于该时间则直接跳出循环,如果晚于则跳过这一次循环,没有设定则全部爬取。
        if start_time:
            if l4_author_img.is_stamp_early(timestamp, start_time):
                break
        if end_time:
            if l4_author_img.is_stamp_late(timestamp, end_time):
                continue
        blog_info_dic = {}
        blog_num += 1

        # 获取标题,过滤没有标题的博客链接
        try:
            title = re.findall(r'[\d]*.title="(.*?)"', blog_info)[0]
            blog_info_dic["title"] = title.encode('latin-1').decode(
                'unicode_escape')
        except:
            blog_info_dic["title"] = ""
        if not blog_info_dic["title"]:
            continue
        # 输出用标题
        blog_info_dic["print_title"] = blog_info_dic["title"].encode(
            "gbk", errors="replace").decode("gbk", errors="replace")

        # 博客的编号 比如https://lindujiu.lofter.com/post/423a9c_1c878d5e6 的 423a9c_1c878d5e6
        blog_index = re.search(r's[\d]*.permalink="(.*?)";',
                               blog_info).group(1)
        blog_info_dic["url"] = author_url + "post/" + blog_index

        # 获取时间
        # time_local = time.localtime(int(timestamp) / 1000)
        time_local = time.localtime(int(int(timestamp) / 1000))
        dt_time = time.strftime("%Y-%m-%d", time_local)
        # public_time = time.strftime("%Y-%m-%d", time.localtime(int(int(timestamp) / 1000)))
        blog_info_dic["time"] = dt_time

        parsed_blog_info.append(blog_info_dic)

    print("归档页面解析完毕,共获取博客链接数%d,带标题博客数%d" % (blog_num, len(parsed_blog_info)))
    if not target_titles:
        return parsed_blog_info
    else:
        filterd_blog_infos = []
        print("开始进行标题过滤")
        for blog_info in parsed_blog_info:
            if title_filter(blog_info["title"], target_titles):
                print("文章 {} 保留".format(blog_info["print_title"]))
                filterd_blog_infos.append(blog_info)
            else:
                print("文章 {} 被过滤掉".format(blog_info["print_title"]))
    print("\n过滤后剩余文章 {} 篇\n".format(len(filterd_blog_infos)))
    if not merger_chapter:

        return filterd_blog_infos
    else:
        print("开始整理章节")
        chapter_infos = chapter_format(target_titles, filterd_blog_infos)
        print("整理完成")
        for target_title in target_titles:
            print("获取到 {} 共{}章".format(
                target_title.encode("gbk",
                                    errors="replace").decode("gbk",
                                                             errors="replace"),
                len(chapter_infos[target_title])))
        print()
        return chapter_infos