zoukankan      html  css  js  c++  java
  • 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()

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

    修改后运行结果无乱码:

  • 相关阅读:
    AT4144[ARC098D]Donation【Kruskal重构树,dp】
    YbtOJ#643机器决斗【贪心,李超树】
    P3273[SCOI2011]棘手的操作【线段树,并查集】
    AT3950[AGC022E]Median Replace【贪心,dp】
    P3760[TJOI2017]异或和【树状数组】
    AT4505[AGC029F]Construction of a tree【构造题,hall定理,网络流】
    Ybt#452序列合并【期望dp】
    AT3949[AGC022D]Shopping【贪心】
    AT4995[AGC034E] Complete Compress【树形dp】
    P4338[ZJOI2018]历史【LCT】
  • 原文地址:https://www.cnblogs.com/sndd/p/11867539.html
Copyright © 2011-2022 走看看