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

完整代码如下:

  1. import sqlite3;
  2.  
  3. class DB(object):
  4. """数据库访问方法的实现"""
  5. """初始化api 产生数据操作的对象 conect 操作的游标"""
  6. def __init__(self):
  7. self.conn={};
  8. self.cus={};
  9. #初始化数据库链接的api
  10. #1产生数据库链接对象
  11. self.conn=sqlite3.connect(r'Test.db');
  12. #2.产生操作的游标
  13. self.cus=self.conn.cursor();
  14. pass;
  15. def create_table(self):
  16.  
  17. sql = " CREATE TABLE if not exists mynews (CrawlTime char,Title char,Content char,PublishTime char,Origin char)"
  18. self.conn.execute(sql)
  19. self.conn.commit()
  20. print('create table successfully')
  21. def insert_into_news(self,ops):
  22. self.conn.execute('insert into mynews(CrawlTime,Title,Content,PublishTime,Origin) values(?,?,?,?,?)',(ops['CrawlTime'],ops['Title'],ops['Content'],ops['PublishTime'],ops['Origin'],));
  23. self.conn.commit();
  24. pass

完整代码如下:

  1. #要求使用urllib3
  2. import urllib.request;
  3. from bs4 import BeautifulSoup;
  4. from DB.DB import DB;
  5.  
  6. db=DB();
  7. import time;
  8. """爬取核心的核心模块,功能只负责爬取研究生调剂信息"""
  9.  
  10. class DrawStu():
  11. """docstring for DrawStu"""
  12. def __init__(self):
  13. self.baseurl='https://yz.chsi.com.cn/kyzx/tjxx/';
  14. db.create_table();
  15. pass;
  16.  
  17. #提取公共的爬取信息的api
  18. def commonsdk(self,url):
  19. response=urllib.request.urlopen(url);#注意 写在内部以后 变成了形参
  20. html=response.read();#read进行乱码处理
  21. print(html);
  22. doc=BeautifulSoup(html);
  23. return doc;
  24.  
  25. #爬取基本列表
  26. def draw_base_list(self,url):
  27. print('url is:::',url);
  28. doc=self.commonsdk(url);
  29. lilist=doc.find('ul',{'class':'news-list'}).findAll('li');
  30. #print(lilist);
  31. #爬取一级参数
  32. for x in lilist:
  33. Title=x.find('a').text;
  34. Time=x.find('span').text
  35. Link='https://yz.chsi.com.cn'+x.find('a').get('href');
  36. #print(Link);
  37. self.draw_detail_list(Link,Title,Time);
  38. pass
  39.  
  40. pass
  41.  
  42. #爬取二级详情的信息参数
  43. def draw_detail_list(self,url,Title,Time):
  44. doc=self.commonsdk(url);
  45. from_info=doc.find('span',{'class':'news-from'}).text;
  46.  
  47. content=doc.find('div',{'class':'content-l detail'}).text;
  48.  
  49. ctime=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime());
  50.  
  51. #将数据 拼合成字典 交给数据库存储的api
  52. data={
  53. 'CrawlTime':ctime,
  54. 'Title':Title,
  55. 'Content':content,
  56. 'PublishTime':Time,
  57. 'Origin':from_info
  58. }
  59. print(data);
  60. print('插入数据库中');
  61.  
  62. db.insert_into_news(data);
  63. pass
  64.  
  65. #爬取页面的总页数
  66. def get_page_size(self):
  67. requesturl=self.baseurl;
  68. pcxt=self.commonsdk(requesturl).find('div',{'class':'pageC'}).findAll('span')[0].text;
  69. print(pcxt);
  70. #re正则表达式 字符串截取api
  71. pagesize=pcxt.strip();
  72. pagearr=pagesize.split('/');
  73. pagestr=pagearr[1];
  74. return int(pagestr[0:2]);
  75. pass

完整代码如下:

  1. from DrawStu.DrawStu import DrawStu;
  2. import time;
  3. import io
  4. import sys
  5. sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
  6. #初始化class 得到对象
  7. draw=DrawStu();
  8. if __name__ == '__main__':
  9. print('爬取研究生调剂信息');
  10. size=draw.get_page_size();
  11. print(size)
  12. for x in range(size):
  13. start=x*50;
  14. print(start);
  15. #print();
  16. created_url='https://yz.chsi.com.cn/kyzx/tjxx/?start='+str(start);
  17. draw.draw_base_list(created_url);
  18.  
  19. pass

数据库界面截图:

二、对于已有代码的理解

部分代码注释:

  改变标准输出的默认编码

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

  改变标准输出的默认编码

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

程序运行后乱码:

防止其乱码的代码:

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

例子代码如下:

  1. """
  2. @Author : 行初心
  3. @Date : 18-9-24
  4. @Blog : www.cnblogs.com/xingchuxin
  5. @Gitee : gitee.com/zhichengjiu
  6. """
  7. import urllib.request
  8.  
  9. def main():
  10.  
  11. url = ""
  12.  
  13. # 服务器给的响应
  14. response = urllib.request.urlopen(url)
  15.  
  16. # 返回一个二进制字符串: b'',无法正常阅读
  17. html = response.read()
  18.  
  19. # 进行解码操作
  20. code_of_html = html.decode('utf-8')
  21.  
  22. # 打印查看网页源代码
  23. print(code_of_html)
  24.  
  25. if __name__ == '__main__':
  26. main()

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

修改后运行结果无乱码:

python爬虫之爬取网站到数据库的更多相关文章

  1. python爬虫:爬取网站视频

    python爬取百思不得姐网站视频:http://www.budejie.com/video/ 新建一个py文件,代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...

  2. Python爬虫之爬取慕课网课程评分

    BS是什么? BeautifulSoup是一个基于标签的文本解析工具.可以根据标签提取想要的内容,很适合处理html和xml这类语言文本.如果你希望了解更多关于BS的介绍和用法,请看Beautiful ...

  3. [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

    转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...

  4. Python爬虫之爬取站内所有图片

    title date tags layut Python爬虫之爬取站内所有图片 2018-10-07 Python post 目标是 http://www.5442.com/meinv/ 如需在非li ...

  5. python爬虫实战---爬取大众点评评论

    python爬虫实战—爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...

  6. from appium import webdriver 使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium)

    使用python爬虫,批量爬取抖音app视频(requests+Fiddler+appium) - 北平吴彦祖 - 博客园 https://www.cnblogs.com/stevenshushu/p ...

  7. Python爬虫之爬取淘女郎照片示例详解

    这篇文章主要介绍了Python爬虫之爬取淘女郎照片示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本篇目标 抓取淘宝MM ...

  8. 初次尝试python爬虫,爬取小说网站的小说。

    本次是小阿鹏,第一次通过python爬虫去爬一个小说网站的小说. 下面直接上菜. 1.首先我需要导入相应的包,这里我采用了第三方模块的架包,requests.requests是python实现的简单易 ...

  9. python爬虫项目-爬取雪球网金融数据(关注、持续更新)

    (一)python金融数据爬虫项目 爬取目标:雪球网(起始url:https://xueqiu.com/hq#exchange=CN&firstName=1&secondName=1_ ...

随机推荐

  1. flex招式心法

    flex布局绝对是我们平常在布局中用的最多的一个属性,我们来看看它在can i use中的浏览器支持度:(截止到2019/11/16) 挖藕,凹森!支持度居然这么好,好到连ie也能支持大部分的flex ...

  2. BlockStack常见词语

    Browser: 用户用来浏览并使用基于 blockstack 网络开发的 app. CLI: Cli 工具用来管理个人的 blockstack id. blockstack.js (and othe ...

  3. 小白到大神,你需要了解的 sqlite 最佳实践

    本文微信公众号「AndroidTraveler」首发. 背景 本文是对一篇英文文档的翻译,原文请见文末链接. 并发数据库访问 假设你实现了自己的 SQLiteOpenHelper. public cl ...

  4. 解决Maven无法下载fastdfs-client-java依赖

    异常信息:Missing artifact org.csource:fastdfs-client-java:jar:1.27-SNAPSHOT 解决方案:jar包在Maven的中央仓库中缺失,需要手动 ...

  5. 损失函数———有关L1和L2正则项的理解

    一.损失函: 模型的结构风险函数包括了   经验风险项  和  正则项,如下所示: 二.损失函数中的正则项 1.正则化的概念: 机器学习中都会看到损失函数之后会添加一个额外项,常用的额外项一般有2种, ...

  6. 安装CentOS 6.x报错"Disk sda contains BIOS RAID metadata"解决方法

    今天在安装CentOS 6.2的时候,当进到检测硬盘的时候,总是过不去,报错如下: Disk sda contains BIOS RAID metadata, but is not part of a ...

  7. 【python之路.一】基础

    数学操作符 数据类型 字符串复制(*复制次数int).连接(+) 该类操作只能同为字符串类型,否则需要强制转换类型 变量名规则 (驼峰式变量名&下划线式均可) # 注释 BIF(built-i ...

  8. Comet OJ - Contest #10 B题 沉鱼落雁

    ###题目链接### 题目大意:有 n 个正整数,每个正整数代表一个成语,正整数一样则成语相同.同一个正整数最多只会出现 3 次. 求一种排列,使得这个排列中,相同成语的间隔最小值最大,输出这个最小间 ...

  9. javascript es6 Promise 异步同步的写法(史上最简单的教程了)

    1 来个简单的例子 var p = new Promise(function(resolve, reject){ //做一些异步操作 setTimeout(function(){ console.lo ...

  10. 目前下载VS2017你可能会遇到这个坑

    可能现在大伙都已经开始使用VS2019进行开发了.VS2019的下载使用也都很简单.由于工作需要,今天要在笔记本上安装VS2017,结果发现,VS2017的下载变得不是那么容易了,官方的下载方式也隐藏 ...