爬虫小实例

一、问题描述与分析

    Q:查询某一只股票,在百度搜索页面的结果的个数以及搜索结果的变化。

    分析:

      搜索结果个数如下图:

      搜索结果的变化:通过观察可以看到,每个一段时间搜索结果的个数是有所变化的,因为百度的搜索结果是听过关

      键字来提供搜索结果的。对此我们从以下结果方面考虑:1、该只股票在近期内有较为明显的波动,对此,含有

      该股票代码的相关信息增多;2、通过观察搜索结果,存在很多以下标识的网站:

      此类标识的网站为广告网站,在考虑分析时,我们可以将其排除。

    A:通过前面“Python爬虫”这一文章,我们也分别从以下:抓取页面、分析页面和存储数据三方面来解决本实例的一些

      技术的实现问题。

二、一些问题

  1、完成的可运行的程序源码,放在个人的Github的Hazy-star这个库中,以下是Github链接:Hazy-star_Python

  2、程序中一些调用的库的使用,具体参考相关库的官方文档

  3、程序中可能仍然存在较多的纰漏以及值得完善的地方,有待大家指正

  4、实例中不涉及具体的数据的分析研究,只关心如何实现数据的获取。以及需要的一些有效数据的提取。

三、爬虫实例的实现

  百度搜索规则语法:

    http://www.baidu.com/s?wd=' 关键字 '+&pn=' + str(搜索页面数)

  抓取页面

    查询功能:baiduText(code, num) 实现输入code(股票代码),num(搜索页面的页数),返回相应的搜索页面

  1. #coding=utf-8
  2. import socket
  3. import urllib.request
  4. import urllib.error
  5.  
  6. def baiduText(code, num):
  7. url = 'http://www.baidu.com/s?wd=' + code + '&pn=' + str(num)
  8. try:
  9. response = urllib.request.urlopen(url, timeout = 10)#下载页面,设定延迟10s
  10. return response.read().decode('gbk', ignore’).encode('utf-8')
  11. except urllib.error.URLError as e: #抛出异常
  12. if isinstance(e.reason, socket.timeout):
  13. print('TIME OUT')

  分析页面

    通过对页面的抓取,我们可以将相应股票代码和搜索页面的HTML文档下载下来,接下来是对页面的分析,我们研究的是,为什么每个一段时间,搜索结果会发生变化,所以,我们考虑将每个搜索页面中搜索结果的标题以及url提取出来,存放在地点数据中,供后续的分析使用。

    首先查找页面搜索结果

    

  1. #coding=utf-8
  2. from bs4 import BeautifulSoup
  3. #全部的收缩结果
  4. def parseHtml(text):
  5. soup = BeautifulSoup( text, features="lxml" )
  6. tags = soup.find_all( 'span' )
  7. #寻找所有的span标签
  8. for tag in tags:
  9. cont = tag.string
  10. if( cont is not None and cont.startswith( '百度为您找到相关结果约' )):
  11. #此处可进行查询优化
  12. cont = cont.lstrip( '百度为您找到相关结果约' )
  13. cont = cont.rstrip( '个' )
  14. cont = cont.replace( ',', '' )
  15. return eval(cont)

  打印搜索结果标题以及URL,对此我们使用字典进行存储提取后的数据

  1. #coding=utf-8
  2. from bs4 import BeautifulSoup
  3. def printurl(text):
  4. #打印出所有搜索结果中网站的URl以及网站名字
  5. soupurl = BeautifulSoup( text, features="lxml" )
  6. #通过分析,搜索结果的标题都是存放在h3中的
  7. tagsurl = soupurl.find_all( 'h3' )
  8. #使用循环将网站以及对应的url传入到字典中
  9. dicturl = {}
  10. for tagurl in tagsurl:
  11. url = [x['href'] for x in tagurl.select('a')][0]
  12. #使用列表生成式子,以及select方法提取搜索结果的url
  13. dicturl.update({tagurl.get_text():url})
  14. return dicturl

  考虑到前面分析时,存在着广告搜索结果的影响,我们对含有广告标识的页面数量进行分析

  1. #coding=utf-8
  2. from bs4 import BeautifulSoup
  3. def printurl(text):
  4. #打印出所有搜索结果中网站的URl以及网站名字
  5. soupurl = BeautifulSoup( text, features="lxml" )
  6. #通过分析,搜索结果的标题都是存放在h3中的
  7. tagsurl = soupurl.find_all( 'h3' )
  8. #使用循环将网站以及对应的url传入到字典中
  9. dicturl = {}
  10. for tagurl in tagsurl:
  11. url = [x['href'] for x in tagurl.select('a')][0]
  12. #使用列表生成式子,以及select方法提取搜索结果的url
  13. dicturl.update({tagurl.get_text():url})
  14. return dicturl

  然后对定义函数,用于判断是否搜索到结果的最后一面

  1. #coding=utf-8
  2. from bs4 import BeautifulSoup
  3. def EndSel(text):
  4. #用于结束搜索的函数
  5. flag = True
  6. temp = []
  7. soupEnd = BeautifulSoup( text, features="lxml" )
  8. #通过分析,搜索结果的标题都是存放在h3中的
  9. tagsEnd = soupEnd.find_all( 'a' )
  10. for tagEnd in tagsEnd:
  11. temp.append(tagEnd.string)
  12. if('下一页>' not in temp):
  13. flag = False
  14. return flag

  下载页面

    通过对下载的页面数据的分析,使用SaveDict(Dict) 实现将抓取的信息存在在的字典再存储到txt文件中,dict相当于我们使用的关系型的数据库。

  1. def saveDict(dict):
  2. # 将字典保存问txt文件
  3. file = open('dict.txt', 'a')
  4. for k,v in dict.items():
  5. file.write(k+'\n'+v+'\n')
  6. file.close()

四、总结

  对于小型的爬虫的创建,我们基本依照上面的基本进行构建即可。示例总未展出主函数,完整的代码见 Github ,主函数主要编写对这些模块的调用,以及逻辑的构建。对于大型的爬虫,在每一部分可能遇到的问题有:

  1、在抓取页面时,有些网站可能有反爬机制,会对爬虫进行拦截,这时我们可能需要使用到代理,避免同一IP反复高频率访问网站被拦截

  2、在分析页面时,有写网站会对HTML页面进行JS加密等,进行计算机爬虫自动爬取,此些页面需要仔细分析其内在逻辑,才能抓取到真正的数据

  3、数据存储,小规模的爬取我们可以使用文件存储,当遇到大规模的数据爬取,我们就需要进行数据库的存储,方便我们或许分析处理数据

  4、对于单一爬虫,即便使用个人PC也可以运行,但是对于大规模的爬虫,我们可能需要考虑分布式布置爬虫进行数据的爬取,以提高数据搜集的效率

  5、对于爬虫中一些高级的运用,后续会再更新,包括一些常见的页面加密解析以及使用代理,模拟分布式、爬取App数据等。

2019-05-16

Python_爬虫小实例的更多相关文章

  1. python爬虫小实例

    1.python爬取贴吧壁纸 1.1.获取整个页面数据 #coding=utf-8 import urllib def getHtml(url): page = urllib.urlopen(url) ...

  2. Python(五)编程小实例

    Python(五)编程小实例 抓取网页信息,并生成txt文件内容! Python抓取网页技能--Python抓取网页就是我们常看见的网络爬虫,我们今天所要用到的就是我们Python中自带的模块,用这些 ...

  3. winform 异步读取数据 小实例

    这几天对突然对委托事件,异步编程产生了兴趣,大量阅读前辈们的代码后自己总结了一下. 主要是实现 DataTable的导入导出,当然可以模拟从数据库读取大量数据,这可能需要一定的时间,然后 再把数据导入 ...

  4. 基于webmagic的爬虫小应用--爬取知乎用户信息

    听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...

  5. 一个python爬虫小程序

    起因 深夜忽然想下载一点电子书来扩充一下kindle,就想起来python学得太浅,什么“装饰器”啊.“多线程”啊都没有学到. 想到廖雪峰大神的python教程很经典.很著名.就想找找有木有pdf版的 ...

  6. CSS应用内容补充及小实例

    一.clear 清除浮动 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  7. Objective-C之代理设计模式小实例

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  8. Objective-C之@类别小实例

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  9. OC小实例关于init方法不小心的错误

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

随机推荐

  1. 刷题记录:[0CTF 2016]piapiapia

    目录 刷题记录:[0CTF 2016]piapiapia 一.涉及知识点 1.数组绕过正则及相关 2.改变序列化字符串长度导致反序列化漏洞 二.解题方法 刷题记录:[0CTF 2016]piapiap ...

  2. hadoop综合

    对CSV文件进行预处理生成无标题文本文件,将爬虫大作业产生的csv文件上传到HDFS 首先,我们需要在本地中创建一个/usr/local/bigdatacase/dataset文件夹,具体的步骤为: ...

  3. 浅谈SOA面向服务化编程架构(dubbo)

      dubbo 是阿里系的技术.并非淘宝系的技术啦,淘宝系的分布式服务治理框架式HSF啦 ,只闻其声,不能见其物.而dubbo是阿里开源的一个SOA服务治理解决方案,dubbo本身 集成了监控中心,注 ...

  4. 范仁义html+css课程---6、表格

    范仁义html+css课程---6.表格 一.总结 一句话总结: 表格中最常用的元素就是table.tr.td.th,还有语义化的thead.tbody.tfoot标签 1.表格构成三个基本要素? t ...

  5. QString 中文编码转换

      版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/xxm524/article/det ...

  6. 前端js 爬取 获取网页

    1.存在问题 same origin policy(同源策略) 页面中的Javascript只能读取,访问同域的网页.这里需要注意的是,Javascript自身的域定义和它所在的网站没有任何关系,只和 ...

  7. 微信小程序的跳转navigateTo()和redirectTo()用法和区别

    原文链接:https://blog.csdn.net/u013128651/article/details/79736410  wx.navigateTo({}) ,保留当前页面,跳转到应用内的某个页 ...

  8. 安装Nvidia显卡驱动、CUDA和cuDNN的方法(jsxyhelu整编)

    Nvidia显卡驱动.CUDA和cuDNN一般都是同时安装的,这里整理的是我成功运行的最简单的方法. 一.Nvidia显卡驱动 1.1 在可以进入图形界面的情况下 直接在"软件和更新&quo ...

  9. 014-docker-终端获取 docker 容器(container)的 ip 地址

    1. 进入容器内部后 cat /etc/hosts 会显示自己以及(– link)软连接的容器IP 2.使用命令 docker inspect --format '{{ .NetworkSetting ...

  10. HTML-头部

    HTML <head> 元素 <head> 元素是所有头部元素的容器.<head> 内的元素可包含脚本,指示浏览器在何处可以找到样式表,提供元信息,等等. 以下标签 ...