看雪精华帖爬虫

看雪自带的搜索感觉不是太好用, 然后弄了个爬虫

目前支持4种功能

1. 爬取某个版块所有的链接, 并保持到文件

2. 自动把精华帖分类出来, 并保存到文件

3. 把含有指定关键字的链接单独保存为文件(针对所有链接)

4. 把含有指定关键字的链接单独保存为文件(针对所有精华帖链接)

github下载地址:

https://github.com/bingghost/pediy_spider

需要下载下面的依赖库

bs4
requests
html5lib

代码如下

#!/usr/bin/env python
# encoding: utf-8
"""
@author:     bingghost
@copyright:  2016 bingghost. All rights reserved.
@contact:
@date:       2016-12-1
@description: 看雪爬虫
"""
import re
import time
import requests
import argparse
from bs4 import BeautifulSoup

import sys
reload(sys)
sys.setdefaultencoding(‘utf8‘)

class PediySpider:
    def __init__(self, spider_url, specified_title):
        self._url = spider_url

        self.file_dict = {"all_title":"all_title.txt",
                          "good_title":"good_title.txt",
                          "filter_title":"filter_title.txt",
                          "filter_good_title":"filter_good_title.txt"}

        # good title
        self.filter_list = [‘jhinfo.gif‘, ‘good_3.gif‘, ‘good_2.gif‘]

        # title specified
        self.specified_title = specified_title

        self.page_count = self.get_page_count()
        pass

    def get_page_content(self, page_num):
        rep_data = requests.get(self._url + str(page_num))
        soup = BeautifulSoup(rep_data.content, ‘html5lib‘)
        return soup

    def get_page_count(self):
        value = int(self.get_page_content(1).select(‘div.pagenav td.vbmenu_control‘)[0].get_text().split(‘ ‘)[-2])
        return value

    def save_file(self, content, filename):
        print content
        with open(filename, ‘a+‘) as f:
            f.write(content.encode(‘utf-8‘) + ‘\n‘)

    def is_good_title(self, item):
        # The item in threads_box is a <td> tag. when we need to find
        # the img tag,we must find in its parent tag namely the <tr> tag.
        img_list = item.parent.find_all(‘img‘)
        for img in img_list:
            if img.get(‘src‘).split(‘/‘)[-1].lstrip() in self.filter_list:
                return True

        return False
        pass

    def is_specified_title(self, title_content):
        if self.specified_title is None:
            return False

        specified_title_encode = self.specified_title.encode(‘utf8‘)
        title_content_encode = title_content.encode(‘utf8‘)
        if specified_title_encode in title_content_encode:
            return True
            pass

        return False
        pass

    def is_good_specified_title(self, title_content):
        if self.specified_title is None:
            return False

        specified_title_encode = self.specified_title.encode(‘utf8‘)
        title_content_encode = title_content.encode(‘utf8‘)
        if specified_title_encode in title_content_encode:
            return True
            pass

        return False
        pass

    def check_content(self, threads_box):
        url_head = ‘http://bbs.pediy.com/showthread.php?‘ + ‘t=‘

        for item in threads_box:
            title_box = item.find(id=re.compile(‘thread_title‘))
            title = title_box.get_text()
            title_url = url_head + title_box.get(‘href‘).split(‘=‘)[-1]

            # now get the title and url
            self.save_file(title + ‘   ‘ + title_url, self.file_dict[‘all_title‘])

            # excellent good and attention title
            is_good_title = self.is_good_title(item)
            if is_good_title:
                # print single_thread_box
                self.save_file(title + ‘   ‘ + title_url, self.file_dict[‘good_title‘])
                pass

            # specified title content
            if self.is_specified_title(title):
                self.save_file(title + ‘   ‘ + title_url, self.file_dict[‘filter_title‘])
                pass

            # specified good title content
            is_good_title_filter = self.is_good_specified_title(title)
            if is_good_title and is_good_title_filter:
                self.save_file(title + ‘   ‘ + title_url, self.file_dict[‘filter_good_title‘])
                pass
        pass

    def worker(self):
        for i in range(1, 100000):
            if i > self.page_count:
                break

            # get all title info in current page
            threads_box = self.get_page_content(i).find_all(id=re.compile(‘td_threadtitle‘))
            self.check_content(threads_box)

            time.sleep(3)

    def start_work(self):
        print "[-] start spider"

        self.worker()

        print "[-] spider okay"
        pass

    pass

def set_argument():
    # add description
    parser = argparse.ArgumentParser(
        description="A spider for the bbs of pediy‘s Android security forum,"
               "also you can modify the url to spider other forum.")

    # add argument
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument(
        ‘-a‘, ‘--all‘,
        action=‘store_true‘,
        help=‘Get all titles‘)

    group.add_argument(
        ‘-f‘, ‘--filter‘,
        type=str,
        default=None,
        help=‘filter title‘)

    group.add_argument(
        ‘-gf‘, ‘--gfilter‘,
        type=str,
        default=None,
        help=‘filter good title‘)

    args = parser.parse_args()
    return args
    pass

def main():
    args = set_argument()

    spider_dict = {"android":"http://bbs.pediy.com/forumdisplay.php?f=161&order=desc&page=",
                   "ios":"http://bbs.pediy.com/forumdisplay.php?f=166&order=desc&page="}

    pediy_spider = None

    if args.all:
        pediy_spider = PediySpider(spider_dict[‘android‘], None)
        pass

    if args.filter:
        pediy_spider = PediySpider(spider_dict[‘android‘], args.filter)
        pass

    if args.gfilter:
        pediy_spider = PediySpider(spider_dict[‘android‘], args.gfilter)
        pass

    pediy_spider.start_work()
    pass

if __name__ == ‘__main__‘:
    main()

效果:

时间: 2025-01-22 00:52:42

看雪精华帖爬虫的相关文章

互联网金融爬虫怎么写-第四课 雪球网股票爬虫(单页面多数据)

Previous on  系列教程: 互联网金融爬虫怎么写-第一课 p2p网贷爬虫(XPath入门) 互联网金融爬虫怎么写-第二课 雪球网股票爬虫(正则表达式入门) 互联网金融爬虫怎么写-第三课 雪球网股票爬虫(ajax分析) 哈哈,我又来了,话说出教程就是这么任性,咱们乘热打铁,把上节课分析完成但是没写的代码给完成了! 工具要求: 教程中主要使用到了 1.神箭手云爬虫 框架  这个是爬虫的基础,2.Chrome浏览器和Chrome的插件XpathHelper 这个用来测试Xpath写的是否正确

看雪论坛论坛小测试的答案

地址:http://bbs.pediy.com/answer.php 看雪论坛是专注于安全方面的论坛.想成为会员而且少花钱的钱的话.就需要答题获得kx. 题目是固定的,答案的顺序不一样,所以下面把答案给贴出来. 测验1:以下哪种发帖标题是允许的? 其他答案都不允许 - 测验2:看雪论坛技术版块允许转载其他网站的帖子吗? 若出处允许,可以全文转载,但是必须标明标明原作者和原创地址 测验3:下面哪条得不到邀请码? 转载了一篇文章 测验4:以下哪种回帖行为是允许的? 其他答案都不允许 测验5:我发了一

湖心亭看雪对比阅读(3)

甲.崇祯五年十二月,余住西湖.大雪三日,湖中人鸟声俱绝.是日更定矣,余挐一小舟,拥毳衣炉火,独往湖心亭看雪.雾凇沆砀,天与云与山与水,上下一白.湖上影子,惟长堤一痕.湖心亭一点.与余舟一芥.舟中人两三粒而已. (张岱<湖心亭看雪>) 乙.是夕,天宇开霁,林间月明,可数毫发.遂弃舟,从参寥策杖并湖而行.出雷峰,度南屏,濯足于惠因涧,入灵石坞,得支径上风篁岭,憩于龙井亭,酌泉据石而饮之.自普宁凡经佛寺十五,皆寂不闻人声.道旁庐舍,灯火隐显,草木深郁,流水激激悲鸣,殆非人间之境.行二鼓,始至寿圣院,

看雪CTF2016CrackMe攻防大赛——第一题

前言 暑假来了,不知道做些什么好,就拿看雪CTF的题来练习练习,学习下大佬们的操作.这是2016年CrackMe攻防赛的第一题,我就被难到了.本来都已经放弃了,但是幸得大佬分享,故跟随大佬的步伐粗略分析了下. 准备 系统:Windows 7 x64 ultimate 工具:IDA pro v7.0(最好用7.0,用6.8会有些问题) 分析 首先运行Crack_Me. 有一个密码输入框,一个OK按钮和一个计数框. 随便输入密码,获得失败提示,提示失败. 载入OD,先运行一下,可是却发现程序直接终止

【走进企业看安全】大神们到站啦!来亚洲诚信“看雪”吧!

6月16日下午,由亚洲诚信携手看雪学院共同主办的技术分享沙龙--看雪学院<走进企业看安全>亚洲诚信站圆满收官!此次活动吸引了40余位技术人员参会,聚焦代码签名安全.邮件安全.等保2.0.Python等议题,共同交流探讨,分享各自在安全建设方面独到的见解. 亚洲诚信CEO翟新元.看雪创始人段钢作为嘉宾出席了本次沙龙活动. 让我们一起回顾分享会上演讲嘉宾带来的精彩内容吧! 议题:企业安全实践之等保与HW 讲师:王磊 看雪论坛业务安全版块版主 演讲嘉宾王磊为大家带来了主题为<企业安全实践之等保

PE工具列表(看雪学院)

PE编辑工具 Stud_PE v. 2.6.0.5 Stud_PE v.2.6.1.0 (2.61汉化版)   PE工具,用来学习PE格式十分方便. LordPE DLX增强版(2008.5.31)   2008.5.31资源名溢出漏洞.缓冲区长度检测是char,但是拷贝的时候是wchar,所以溢出了.by somuchhttp://bbs.pediy.com/showthread.php?t=64935 2006.11.30更新freecat制作的功能插件LordPeFix.dll,修正Lor

互联网金融爬虫怎么写-第二课 雪球网股票爬虫(正则表达式入门)

系列教程: 互联网金融爬虫怎么写-第一课 p2p网贷爬虫(XPath入门) 上一节课我们一起通过一个p2p网贷爬虫,深入了解了一下XPath以及其在最终实际使用中的写法.可以毫不夸张的说,对于写简单爬虫来说,最最重要的,就是使用好XPath,以及这一课要讲的正则表达式. 正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE) 正 则表达式几乎出现在每一个编程语言中,有着极其广泛的应用,比如做网页的时候,判断用户输入的是

涛舅舅游戏论坛精华帖汇总

1.[悬赏求助区] 微信游戏分享时小图片不显示?求帮助 2.[悬赏求助区] 最近哪些游戏在朋友圈里比较流行? 3.[VIP微信小游戏源码] <测一测你的颜值指数>武媚娘版 4.[VIP微信小游戏源码] 火爆朋友圈:测一测你的颜值指数(带图片上传功能) 5.[综合讨论区] 内牛满面!十一只猫的故事 6.[新人报道] 新人报到 7.[VIP微信小游戏源码] [h5游戏源码]冲击50 8.[html5游戏修改指导] 真正的一键关注,简单粗暴! 9.[html5游戏修改指导] 涛舅舅独家:JS-SDK

程序员式浪漫:Python 带你看雪啦

前段时间笔者写了一篇题为<用 Python 来一场人工造雪>的文章,但大家似乎都不满足仅仅是一个图片的雪花,都想来一场动态的人工降雪.于是便有了下面的内容: 具体介绍 动态版的实现主要是依靠 pygame 这个模块,从绘制到实现动态移动,最初的想法是按照飞机大战的思路把飞机替换成上次绘制的科赫雪花,自己试了试效果很差就是一张张图片在屏幕上乱飞,通过百度发现 pygame.draw 模块,跟 turtle 差不多.当然还是少不了 random,自己做过的 Python 面试题[BAT版](02)