• 前言:

  这是一篇来自整理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. HNOI2018做题笔记

    HNOI2018 寻宝游戏(位运算.基数排序) 看到位运算就要按位考虑.二进制下,\(\land 1\)与\(\lor 0\)没有意义的,\(\land 0\)强制这一位变为\(0\),\(\lor ...

  2. 开源的mqtt服务器

    看介绍挺强大,开源,可运行在Linux和Windows,文档中有相关测试工具,及客户端介绍. 希望有机会应用.http://www.emqtt.com/

  3. BZOJ 4804: 欧拉心算

    数论题不多BB,直接开始推导吧: \(\sum_{i=1}^n \sum_{j=1}^n \phi(gcd(i,j))\) \(=\sum_{i=1}^n \sum_{j=1}^n \sum_{d=1 ...

  4. iOS app签名原理

    基本原理: 公钥能够验证私钥的签名是否正确. Apple后台有一个私钥A,iOS内置一个公钥A,与私钥A对应.(A:代表Apple,即苹果) 本地产生一对公钥L.私钥L,(L:代表Local,即本地) ...

  5. Visual Studio2017 数据库架构比较

    一.前言 开发的时候在测试服务器上和线网服务器上面都有我们的数据库,当我们在线网上面修改或者新增一些字段后,线网的数据库也需要更新,这个时候根据表的修改记录,然后在线网上面一个一个增加修改很浪费效率而 ...

  6. 虚拟机console基础环境配置——系统镜像站点配置

    1. 概述2. 部署HTTP服务器2.1 YUM安装httpd2.2 配置httpd2.3 启动httpdf2.4 测试httpd3. 部署FTP服务器3.1 YUM安装vsftpd3.2 配置vsf ...

  7. mysql主从同步(5)-同步延迟状态考量(seconds_behind_master和pt-heartbea)

    一般情况下,我们是通过"show slave status \G;"提供的Seconds_Behind_Master值来衡量mysql主从同步的延迟情况.具体说明见:mysql主从 ...

  8. 最小生成树模板题POJ - 1287-prim+kruskal

    POJ - 1287超级模板题 大概意思就是点的编号从1到N,会给你m条边,可能两个点之间有多条边这种情况,求最小生成树总长度? 这题就不解释了,总结就算,prim是类似dijkstra,从第一个点出 ...

  9. Linux内核读书笔记第三周 调试

    内核调试的难点在于它不能像用户态程序调试那样打断点,随时暂停查看各个变量的状态. 也不能像用户态程序那样崩溃后迅速的重启,恢复初始状态. 用户态程序和内核交互,用户态程序的各种状态,错误等可以由内核来 ...

  10. DWR实现服务器向客户端推送消息

    原文链接 http://www.blogjava.net/stevenjohn/archive/2012/07/07/382447.html这片文章还是给了我很大帮助,再次表示感谢,下面我将这两天的研 ...