• 前言:

  这是一篇来自整理EVERNOTE的笔记所产生的小博客,实现功能主要为用广度优先算法爬取小故事网,爬满100个链接并写入mysql,虽然CS作为双学位已经修习了三年多了,但不仅理论知识一般,动手能力也很差,在学习的空余时间前前后后DEBUG了很多次,下面给出源代码及所遇到的BUG。

  本博客参照代码及PROJECT来源:http://078886.cn


  • 源代码:
 1 import requests as rq
 2 import re
 3 import codecs
 4 import queue
 5 import pymysql
 6 from urllib.request import urlopen
 7 from bs4 import BeautifulSoup
 8
 9 tasks = queue.Queue()  # 链接队列
10 tasks_pass = set()  # 已队列过的链接
11 results = {}  # 结果变量
12 count = 0  # 爬取页面总数
13 tasks.put('/index.html')  # 把主页加入到链接队列
14 tasks_pass.add('/index.html')  # 把主页加入到已队列链接
15 db = pymysql.connect("localhost","testuser","test123","TESTDB",charset='gbk')
16 dbc = db.cursor()
17
18 while count<=100:
19     url = tasks.get() #取出一个链接
20     url = 'http://wap.xigushi.com'+url
21     web = rq.get(url).content.decode('gbk') #这里的编码要看实际情形而定
22     urls = re.findall('href="(/.*?)"', web) #查找所有站内链接
23     for u in urls:
24         if u not in tasks_pass: #把还没有队列过的链接加入队列
25             tasks.put(u)
26             tasks_pass.add(u)
27     html=urlopen(url)
28     bsObj=BeautifulSoup(html.read(),"lxml")
29     if not (re.search('images',url)):
30         # print(re.search('images', url))
31         text=bsObj.title.get_text()
32         print(url + '   ' + text)
33         sql = "insert into data1(url,title) values(%s,%s);"
34         data=(url,text)
35         dbc.execute(sql,data)
36         db.commit()
37     else:
38         if (re.search('images',url).span()):
39             print('---------------------------skipping--------------------------------------------')
40     count += 1
41 db.close()
42
43 with codecs.open('results.txt', 'w', encoding='utf-8') as f:
44         f.write('\n'.join(results.items()444814.cn))

  • 备注:

  原PROJECT采取多线程并写入MongoDB,我因为还不熟悉多线程,采取了单线程,出于对mysql的偏好和熟悉选取了mysql。


  • BUG:
    1. 编码问题:
      小故事网的编码是GB2312,可以从网页源代码的META标签中读出,因为GBK向下与GB2312兼容,所以可以用GBK解码。值得注意的是,mysql默认编码为latin-1,遇到编码问题时,在google时给出的答案都是UTF-8,但在将mysql字符集改为UTF-8后,pycharm读取正常,但mysql显示还是乱码,需要将其改为GBK才可以,虽然在猜想UTF-8应该兼容GBK才对...在对mysql修改字符集的时候,又反复操作了几次,才发现原来有数据库、表、字段的区别...最终都改了...
      修改mysql字符集这个网站讲得很好:
    2. 正则表达式匹配问题:
      代码主要是为了爬取链接和对应的标题,但在碰到图片的时候就会报错,这时打算写个正则过滤掉,没想到写出来了没反应...最后只能加了个判断过滤...coding仍需加强...

(python爬取小故事网并写入mysql)的更多相关文章

  1. Python爬取中国天气网

    Python爬取中国天气网 基于requests库制作的爬虫. 使用方法:打开终端输入 “python3 weather.py 北京(或你所在的城市)" 程序正常运行需要在同文件夹下加入一个 ...

  2. python爬取天气后报网

    前言 大二下学期的大数据技术导论课上由于需要获取数据进行分析,我决定学习python爬虫来获取数据.由于对于数据需求量相对较大,我最终选择爬取 天气后报网,该网站可以查询到全国各地多年的数据,而且相对 ...

  3. 适合初学者的Python爬取链家网教程

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: TinaLY PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  4. Python爬取中国票房网所有电影片名和演员名字,爬取齐鲁网大陆所有电视剧名称

    爬取CBO中国票房网所有电影片名和演员名字 # -*- coding: utf-8 -*- # 爬取CBO中国票房网所有电影片名 import json import requests import ...

  5. python爬取斗图网中的 “最新套图”和“最新表情”

    1.分析斗图网 斗图网地址:http://www.doutula.com 网站的顶部有这两个部分: 先分析“最新套图” 发现地址栏变成了这个链接,我们在点击第二页 可见,每一页的地址栏只有后面的pag ...

  6. Python爬取拉勾网招聘信息并写入Excel

    这个是我想爬取的链接:http://www.lagou.com/zhaopin/Python/?labelWords=label 页面显示如下: 在Chrome浏览器中审查元素,找到对应的链接: 然后 ...

  7. Python 爬取煎蛋网妹子图片

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2017-08-24 10:17:28 # @Author : EnderZhou (z ...

  8. Python爬取新浪微博评论数据,写入csv文件中

    因为新浪微博网页版爬虫比较困难,故采取用手机网页端爬取的方式 操作步骤如下: 1. 网页版登陆新浪微博 2.打开m.weibo.cn 3.查找自己感兴趣的话题,获取对应的数据接口链接 4.获取cook ...

  9. python爬取中国知网部分论文信息

    爬取指定主题的论文,并以相关度排序. #!/usr/bin/python3 # -*- coding: utf-8 -*- import requests import linecache impor ...

随机推荐

  1. SpringMVC之声明式校验

    1.在http://www.cnblogs.com/wtzl/p/8830678.html编程式校验基础上 2.新增jar包三个 3.StudentModel.java(声明式) package 声明 ...

  2. WPF中, 启用添加到RichTextBox中的控件

    原文:WPF中, 启用添加到RichTextBox中的控件   WPF中, 启用添加到RichTextBox中的控件                                           ...

  3. TensorFlow入门(五)多层 LSTM 通俗易懂版

    欢迎转载,但请务必注明原文出处及作者信息. @author: huangyongye @creat_date: 2017-03-09 前言: 根据我本人学习 TensorFlow 实现 LSTM 的经 ...

  4. KMeans算法分析以及实现

    KMeans KMeans是一种无监督学习聚类方法, 目的是发现数据中数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好. 无监督学习,也就是没有对应的标签,只有数据 ...

  5. Docker 快速验证 HTML 导出 PDF 高效方案

    需求分析 项目中用到了 Echarts,想要把图文混排,当然包括 echarts 生成的 Canvas 图也导出 PDF. 设计和实现时,分析了 POI.iText.freemaker.world 的 ...

  6. Effective C++学习笔记之#define

    前言 条款02:尽量以const.enum.inline替换#define:尽可能用编译器代替不必要的预处理器. 内容 一.对于单纯常量 1.const 有两种特殊的const,常量指针和class专 ...

  7. Swarm基于多主机容器网络 - overlay networks 梳理

    前面介绍了Docker管理工具-Swarm部署记录,下面重点说下Swarm基于多主机容器通信的覆盖网络 在Docker版本1.12之后swarm模式原生支持覆盖网络(overlay networks) ...

  8. 《Linux内核分析》第六周学习总结

    <Linux内核分析>第六周学习总结                         ——进程的描述和进程的创建 姓名:王玮怡  学号:20135116 一.理论部分 (一)进程的描述 1 ...

  9. 【论文笔记】Domain Adaptation via Transfer Component Analysis

    论文题目:<Domain Adaptation via Transfer Component Analysis> 论文作者:Sinno Jialin Pan, Ivor W. Tsang, ...

  10. SyntaxHighlighter行号显示错误问题解决方案

    SyntaxHighlighter是根据代码中的换行符分配行号的.但是,如果一行代码或者注释比较长,在页面显示时需要分成多行显示,会出现行号对不上的问题,像这样: 通过设置CSS强制不换行,可以保证行 ...