zoukankan      html  css  js  c++  java
  • Python_爬虫小实例

    爬虫小实例

    一、问题描述与分析

        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+'
    '+v+'
    ')
    6     file.close()

     四、总结

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

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

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

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

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

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

    2019-05-16

  • 相关阅读:
    npm 之 --save , -D,--save -dev的区别
    webpack 之 打包(最新版)
    npm 与 yarn 对比
    webpack 之 打包图片文件
    webpack 之 打包less文件
    javascript 之 Event Loop
    package.json中type的含义
    webpack 之 打包css文件操作
    常见问题 之 webpack打包css问题
    类方法和对象方法
  • 原文地址:https://www.cnblogs.com/hazy-star/p/10873603.html
Copyright © 2011-2022 走看看