爬虫实战--糗事百科

闲来无聊,在网上按照教程写了一个Python爬虫,就是窃取数据然后保存下来爬虫实战–糗事百科。从糗百上爬取段子,然后输出到console,我改了一下保存到了数据库。
不扯没用的,直接上代码:

这是爬取得部分

#!/usr/bin/python
# -*- coding:utf-8 -*-
import urllib
import urllib2
import re
import thread
import time
import QsbkDb

class QSBK:
    def __init__(self):
        self.db = QsbkDb.CQsbkDb("database", "user", "password")
        self.db.connect_db()
        self.pageIndex = 1
        self.user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
        self.headers = {'User-Agent' :self.user_agent}

    def __del__(self):
        self.db.close_db()

    def getPage(self,pageIndex):
        try:
            url = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
            request = urllib2.Request(url,headers=self.headers)
            response = urllib2.urlopen(request)
            pageCode = response.read().decode('utf-8')
            return pageCode
        except urllib2.URLError,e:
            if hasattr(e,"reason"):
                print "error",e.reason
            if hasattr(e, "code"):
                print "code",e.code
                return None

    def getPageItems(self,pageIndex):
        pageCode = self.getPage(pageIndex)
        if not pageCode:
            print "page load error"
            return None
        pattern = re.compile('h2>(.*?)</h2.*?content">(.*?)</.*?number">(.*?)</',re.S)
        items = re.findall(pattern,pageCode)
        pageStories = []
        for item in items:
            pageStories.append([item[0].strip(),item[1].strip(),item[2].strip()])
        return pageStories

    def insert_db(self, author, support, context):
        _command = 'insert into Jokes(author,support, context)values(\'%s\', %d, \'%s\')'%(author, int(support), context)
        #print _command
        self.db.execute_db(_command)

    def cawler(self):
        self.db.execute_db('truncate table Jokes')
        for index in range(1,36):
            pageStore = self.getPageItems(index)

            if pageStore == None:
                print "Load page "+ str(index) +" failure\r\n"
                continue

            for store in pageStore:
                page = index
                try:
                    #print u"第%d页\t发布人:%s\t 赞:%s\n%s\r\n" %(page,store[0],store[2],store[1])
                    self.insert_db(store[0], store[2], store[1])
                except Exception as e:
                    print "reson",e.message

            del pageStore
            time.sleep(1) #这个地方一定不要干掉

time.sleep(1)睡一下不是白睡的,如果不加这个服务器会作出判断,认为你是DDOS攻击(因为我们一直在request),有的网站会这样,而有的网站则不会。

这是数据库操作部分:

#!/usr/bin/python
 # -*- coding:utf-8 -*- 
import MySQLdb

class CQsbkDb:
    def __init__(self, name, user, passwd):
        self.db_name = name
        self.db_usr = user
        self.db_psw = passwd

    def connect_db(self):
        self.db_connect = MySQLdb.connect("localhost", self.db_usr, self.db_psw, self.db_name, charset='utf8')
        self.db_connect.select_db('qsbk') #你存放糗百的数据库
    def close_db(self):
        self.db_connect.close()

    def execute_db(self, command):
        _cursor = self.db_connect.cursor()
        try:
            _cursor.execute(command)
            self.db_connect.commit()
            _cursor.close()
        except Exception as e:
            print e.message
            self.db_connect.rollback()

lz用的是mysql数据库,数据库的操作网上一抓一大把,我就不多说了。
先说一下表的结构:
名字叫做 Jokes:
数据表

key是插入的编号num,设置为auto_increment自增模式,所以我们可以看见在QSBK中insert_db函数中num项为空,它会自己设置不用管。
num: 段子编号 key
author: 作者
support: 点赞数
context:段子内容

这里面有个需要注意的问题就是建表的时候你要让author和context支持中文gbk。

alter table Jokes modify context text character set gbk;

alter table Jokes modify author text character set gbk;

以上基本就是这些了,目前仅支持文本段子,不支持图片。
运行结果:
运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值