zoukankan      html  css  js  c++  java
  • python自动化之爬虫原理及简单案例

    【爬虫案例】动态地图里的数据如何抓取:以全国PPP综合信息平台网站为例  http://mp.weixin.qq.com/s/BXWTf5hmq8vp91ZvgaphEw

    【爬虫案例】动态页面的抓取!以东方财富网基金行情数据为例   http://mp.weixin.qq.com/s/bbw5caz4EfJn5mwbDMVfuQ

    【爬虫案例】获取历史天气数据   http://mp.weixin.qq.com/s/MlqJUuH0JjTujMzGJp_7kw

    【爬虫案例】电影票房数据抓取   https://mp.weixin.qq.com/s/UgH53P86Y0nfY-67EDQ8wA 

    #####http://www.lishi.tianqi.com/yangzhong/201407.html

    #####http://lishi.tianqi.com/yangzhong/201407.html

    #####www.cbooo.cn/year?year=2016

    #####www.cpppc.org:8082/efmisweb/ppp/projectLibrary/toPPPMap.do

    #####fundact.eastmoney.com/banner/gp.html?from=groupmessage&isappinstalled=0

    #

    #http://lishi.tianqi.com/yangzhong/201407.html

    ##################################################################

    ##############爬取票房纪要

    #####www.cbooo.cn/year?year=2016

    1、确认搜的票房数据在代码里(Ctrl+F搜索出来)搜索关键字:如"美人鱼",是否在页面上

    2、模板(对于数据在页面上适用):获取页面/解析网页

    3、找到数据在哪?定位数据首选用id定位

    4、返回列表的话找对应的项

    #########采用解析器:'lxml',解析页面;也可以用html.parse解析器

    分析数据在哪个框里面,这是一个table,定位方式首选用id定位

    soup.find_all 找到所有table,限制条件为id=tbContent

    里面每一个tr代表一行,一个电影即为一行,找到所有tr标签

    td表示当中的每一个单元,找出当中第一个中的a标签中的title属性即为需要的电影名称

    dd与dl是现在很少用的标签,表示为定义式,有点类似于字典

    import requests ############获取页面

    from bs4 import BeautifulSoup  ############解析网页

    year=2017

    url='http://www.cbooo.cn/year?year='+str(year)

    rawhtml=requests.get(url).content

    print(type(rawhtml))

    soup=BeautifulSoup(rawhtml,'lxml') #########采用解析器:'lxml',解析页面;也可以用html.parse解析器

    ###soup.select('dl.dltext dd')

    ###有快捷的方式:能把所有标签去掉,soup.select('dl.dltext dd')[0].get_text()

    def getYear(year):

             #year=2017

             url='http://www.cbooo.cn/year?year='+str(year)

             rawhtml=requests.get(url).content

             #print(type(rawhtml))

             soup=BeautifulSoup(rawhtml,'lxml') #########采用解析器:'lxml',解析页面;也可以用html.parse解析器

             #print(type(soup))

             return soup

    def getInfo(url):

             rawhtml=requests.get(url).content

             soup=BeautifulSoup(rawhtml,'lxml')

             return soup

    print(type(soup))

    movies_table=soup.find_all('table',{'id':"tbContent"})[0]  ####用find_all()方法,通过table标签,加上字典参数,属性为id=tbContent

    movies=movies_table.find_all('tr')

    moviename=[movie.find_all('td')[0].a.get('title') for movie in movies[1:]]

    movielink=[movie.find_all('td')[0].a.get('href') for movie in movies[1:]]

    movietype=[movie.find_all('td')[1].string for movie in movies[1:]]

    movieboxoffice =[int(movie.find_all('td')[2].string) for movie in movies[1:]]

    #moviedirector=[getInfo(url).find_all('dl',{'class':'dltext'})[0].find_all('dd')[0].a.get('title') for url in movielink]

    moviedirector=[getInfo(url).select('dl.dltext dd')[0].get_text() for url in movielink]

    ############转成数据框&统计分析

    import pandas as pd

    df=pd.DataFrame({'names':moviename,'types':movietype,'boxoffice':movieboxoffice,'link':movielink,'directors':moviedirector})

    import numpy as np

    df.groupby('types').agg({'boxoffice':["count","mean"]})

    #############写到文件中

    df.to_csv(r'C:UsersAdministratorDesktop电影.csv')

    标签是div,div在html中意思为一个块集

    确认html页面真的存在代码中

    确认数据在代码中,即好爬,如果不在代码中,用js进行渲染,即不好爬

    再看有没有翻页,没有翻页,即OK

    这里以一个电影评分的网站为例,介绍数据抓取的基本流程和方法。

    标准配置:

    --requests:抓取网址的HTML内容

    --BeautifulSoup:解析HTML源码,提供方便的查询接口

    --re:正则表达式,通过描述规则从字符中提取需要的数据

    (这里不作介绍)

    import requests  ########获取页面

    from  bs4 import BeautifulSoup  #######解析网页

    url='http://www.cbooo.cn/year?year=2016'

    rawhtml=requests.get(url).content   #######获取内容

    ##################################################################

    ##############爬取天气纪要

    ###############http://www.tianqihoubao.com/weather/top/shenzhen.html

    ##############数据抓取:

    ##############某些情况下需要从网络抓取数据,比如舆情监控需要抓取相关的新闻内容;

    ##############判断天气原因是否对超市的销量有影响时,除了已有的销量数据外还需要从

    ##############网络抓取每日的天气数据

    1、下载的url数据

    2、在谷歌浏览器右键:检查,找到每一行数据在不在网页代码中,找到整个下载数据是个table,tblite_go

    3、一页一页加载时,发现问题:网址未发生变化,没有刷新

                       1)打开network,点击每一页时发现Request URL不一致,此时表明为异步加载;

                       2)将不同页的链接复制出来,查看区别;

                       3)找到规律,将链接查看,即对应数据;

                       4)由于r.content为乱码,r.text为中文格式;

                       5)解析;

                       6)每一页写入;

    import requests ############获取页面

    from bs4 import BeautifulSoup  ############解析网页

    url='http://www.tianqihoubao.com/weather/top/shenzhen.html'

    rawhtml=requests.get(url).content

    weatherhtml=BeautifulSoup(rawhtml,'lxml')

    dateset=[weather.find_all('td')[1].b.a.string for weather in weatherhtml.find_all('table')[0].find_all('tr')[2:]]

    dayweatherset=[weather.find_all('td')[2].string for weather in weatherhtml.find_all('table')[0].find_all('tr')[2:]]

    daywindset=[weather.find_all('td')[3].string for weather in weatherhtml.find_all('table')[0].find_all('tr')[2:]]

    daytempset=[weather.find_all('td')[4].string for weather in weatherhtml.find_all('table')[0].find_all('tr')[2:]]

    nightweatherset=[weather.find_all('td')[5].string for weather in weatherhtml.find_all('table')[0].find_all('tr')[2:]]

    nightwindset=[weather.find_all('td')[6].string for weather in weatherhtml.find_all('table')[0].find_all('tr')[2:]]

    nighttempset=[weather.find_all('td')[7].string for weather in weatherhtml.find_all('table')[0].find_all('tr')[2:]]

    import pandas as pd

    df=pd.DataFrame({'日期':dateset,'白天天气':dayweatherset,'白天风向':daywindset,'白天温度':daytempset,'晚上天气':nightweatherset,'晚上风向':nightwindset,'晚上温度':nighttempset})

    import numpy as np

    df.to_csv(r'C:UsersAdministratorDesktop天气.csv')

  • 相关阅读:
    Java基础课程---将一个字符串反转,将字符串中指定部分进行反转,比如,"abcdefg", 反转为"abfedcg"
    在Centon64位中卸载安装时系统自带的--openjdk,并且安装自己需要的jdk
    Java基础课程---sleep()方法 和 wait()方法的异同(面试题)
    Java基础课程---权限修饰符
    Java基础课程---
    MySQL 创建库
    brew
    android webview load 本地文件需要注意的地方
    android下隐藏标题栏
    android webview无法加载网页
  • 原文地址:https://www.cnblogs.com/dudumiaomiao/p/8043689.html
Copyright © 2011-2022 走看看