python爬虫之爬取网站到数据库

一、根据已有程序运行得到的结果

 完整代码如下:

import sqlite3;

class DB(object):
    """数据库访问方法的实现"""
    """初始化api 产生数据操作的对象 conect 操作的游标"""
    def __init__(self):
        self.conn={};
        self.cus={};
        #初始化数据库链接的api
        #1产生数据库链接对象
        self.conn=sqlite3.connect(r'Test.db');
        #2.产生操作的游标
        self.cus=self.conn.cursor();
        pass;
    def create_table(self):
        
        sql = " CREATE TABLE if not exists mynews (CrawlTime char,Title char,Content char,PublishTime char,Origin char)"
        self.conn.execute(sql)
        self.conn.commit()
        print('create table successfully')
    def insert_into_news(self,ops):
        self.conn.execute('insert into mynews(CrawlTime,Title,Content,PublishTime,Origin) values(?,?,?,?,?)',(ops['CrawlTime'],ops['Title'],ops['Content'],ops['PublishTime'],ops['Origin'],));
        self.conn.commit();
        pass

完整代码如下:

#要求使用urllib3
import urllib.request;
from bs4 import BeautifulSoup;
from DB.DB import DB;

db=DB();
import time;
"""爬取核心的核心模块,功能只负责爬取研究生调剂信息"""


class DrawStu():
    """docstring for DrawStu"""
    def __init__(self):
        self.baseurl='https://yz.chsi.com.cn/kyzx/tjxx/';
        db.create_table();
        pass;

    #提取公共的爬取信息的api
    def commonsdk(self,url):
        response=urllib.request.urlopen(url);#注意 写在内部以后 变成了形参 
        html=response.read();#read进行乱码处理
        print(html);
        doc=BeautifulSoup(html);
        return doc;


    #爬取基本列表
    def draw_base_list(self,url):
        print('url is:::',url);
        doc=self.commonsdk(url);
        lilist=doc.find('ul',{'class':'news-list'}).findAll('li');
        #print(lilist);
        #爬取一级参数
        for x in lilist:
            Title=x.find('a').text;
            Time=x.find('span').text
            Link='https://yz.chsi.com.cn'+x.find('a').get('href');
            #print(Link);
            self.draw_detail_list(Link,Title,Time);
            pass

        pass

    #爬取二级详情的信息参数
    def draw_detail_list(self,url,Title,Time):
        doc=self.commonsdk(url);
        from_info=doc.find('span',{'class':'news-from'}).text;
        
        content=doc.find('div',{'class':'content-l detail'}).text;
        
        ctime=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime());
        
        #将数据 拼合成字典 交给数据库存储的api
        data={
          'CrawlTime':ctime,
          'Title':Title,
          'Content':content,
          'PublishTime':Time,
          'Origin':from_info
        }
        print(data);
        print('插入数据库中');

        db.insert_into_news(data);
        pass

    #爬取页面的总页数
    def get_page_size(self):
        requesturl=self.baseurl;
        pcxt=self.commonsdk(requesturl).find('div',{'class':'pageC'}).findAll('span')[0].text;
        print(pcxt);
        #re正则表达式 字符串截取api
        pagesize=pcxt.strip();
        pagearr=pagesize.split('/');
        pagestr=pagearr[1];
        return int(pagestr[0:2]);
        pass
        
        

完整代码如下:

from DrawStu.DrawStu import DrawStu;
import time;
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
#初始化class 得到对象
draw=DrawStu();
if __name__ == '__main__':
    print('爬取研究生调剂信息');
    size=draw.get_page_size();
    print(size)
    for x in range(size):
        start=x*50;
        print(start);
        #print();
        created_url='https://yz.chsi.com.cn/kyzx/tjxx/?start='+str(start);
        draw.draw_base_list(created_url);
        
        pass

数据库界面截图:

二、对于已有代码的理解

部分代码注释:

  改变标准输出的默认编码 

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')

  改变标准输出的默认编码 

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')

程序运行后乱码:

防止其乱码的代码:

在网上搜索找到的解决方法:

例子代码如下:

"""
@Author : 行初心
@Date   : 18-9-24
@Blog   : www.cnblogs.com/xingchuxin
@Gitee  : gitee.com/zhichengjiu
"""
import urllib.request


def main():

    url = ""

    # 服务器给的响应
    response = urllib.request.urlopen(url)

    # 返回一个二进制字符串: b'',无法正常阅读
    html = response.read()

    # 进行解码操作
    code_of_html = html.decode('utf-8')

    # 打印查看网页源代码
    print(code_of_html)


if __name__ == '__main__':
    main()

修改代码,加上一行解码的的代码后再输出,修改后代码如下:

修改后运行结果无乱码:

原文地址:https://www.cnblogs.com/sndd/p/11867539.html