美文网首页数据分析
产品推广策略数据分析 - 数据获取

产品推广策略数据分析 - 数据获取

作者: 羋学僧 | 来源:发表于2018-12-25 16:59 被阅读0次

产品推广策略数据分析 - 数据获取


具体实施:

根据百度指数热门程度直观分析,
抓取百度新闻 旅行青蛙 (按内容查询,按时间排序)关键字的文字标题和相关信息,
时间从 2018-1-15到2018-2-18日
    目前是:新闻页码11-36,每页20条,一共27页
    随着时间变化,新闻增加,抓取页码也应该跟着变化

In [1]:

import numpy as np
import pandas as pd

import json
import requests
from lxml import etree

百度指数 数据手动录入后生成表格

2018-1-15 到 2018-2-18

In [2]:

baidu = ['5408','10007','17817','39514','82117','140768','298637','406072','677541','858690','839792','744390','653541','496701','390412','322492','256334','212914','180933','157411','140104','120038','125914','105679','88426','75185','66567','61036','54812','49241','42768','35784','33774','33621','34388']
baidu

date = pd.date_range('2018-1-15', '2018-2-18')
date

baidu2 = pd.DataFrame(baidu, index=date, columns=['百度指数'])
baidu2.head()

Out[2]:

百度指数
2018-01-15 5408
2018-01-16 10007
2018-01-17 17817
2018-01-18 39514
2018-01-19 82117

In [3]:

baidu2.shape

Out[3]:

(35, 1)

保存

In [4]:

baidu2.to_csv('data/baidu_index.csv')

读取

In [5]:

baidu = pd.read_csv(
    'data/baidu_index.csv',
    parse_dates=['百度指数'],
    index_col='Unnamed: 0',  # 将某列设为行索引
)

baidu.head()

Out[5]:

百度指数
2018-01-15 5408
2018-01-16 10007
2018-01-17 17817
2018-01-18 39514
2018-01-19 82117

In [6]:

baidu.info()
<class 'pandas.core.frame.DataFrame'>
Index: 35 entries, 2018-01-15 to 2018-02-18
Data columns (total 1 columns):
百度指数    35 non-null object
dtypes: object(1)
memory usage: 560.0+ bytes

百度指数列错误,改为整型

In [7]:

bindex = baidu['百度指数'].astype(np.int)
bindex.head()

Out[7]:

2018-01-15     5408
2018-01-16    10007
2018-01-17    17817
2018-01-18    39514
2018-01-19    82117
Name: 百度指数, dtype: int32

百度新闻 内容数据抓取

可以按新闻内容查询和按标题查询,这里使用内容查询,按时间排序(标题查询使用注释的代码)

抓取时间:约15秒

In [8]:

# 数据抓取

c = []  # 存储抓取数据

# 带header请求
headers = {
    # 去浏览器拷贝
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36",
    "Cookie":"BAIDUID=7EC1D75354F6C7C565DEF73796283C53:FG=1; BIDUPSID=7EC1D75354F6C7C565DEF73796283C53; PSTM=1514274634; MCITY=131-131%3A; BDSFRCVID=92CsJeCCxG37sLJ71wuc0gflDkFOeQZRddMu3J; H_BDCLCKID_SF=tR30WJbHMTrDHJTg5DTjhPrMeH5mbMT-027OKK85-hRkMIj65t-2bPKjQMRlW-QIyHrb0p6athF0HPonHjtBDjbP; BD_CK_SAM=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; delPer=0; ZD_ENTRY=baidu; pgv_pvi=7431016448; pgv_si=s8918307840; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; LOCALGX=%u957F%u6625%7C%31%37%38%34%7C%u957F%u6625%7C%31%37%38%34; Hm_lvt_e9e114d958ea263de46e080563e254c4=1540026478,1540446397,1540885527; Hm_lpvt_e9e114d958ea263de46e080563e254c4=1540886723; PSINO=2; BDSVRTM=358; H_PS_PSSID=",
}

# 按时间顺序抓取
page = 180
while page <= 680:
    # 搜索新闻标题:page, 200-660,每页20条数据,24页
#     url = "http://news.baidu.com/ns?word=title%3A%28%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99%29&pn={}&cl=2&ct=0&tn=newstitle&rn=20&ie=utf-8&bt=0&et=0".format(page)
    # 搜索新闻内容:page, 200-700,每页20条数据,27页
#     print(page)
    url = "http://news.baidu.com/ns?word=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&pn={}&cl=2&ct=0&tn=news&rn=20&ie=utf-8&bt=0&et=0".format(page)

    rh = requests.get(url, headers=headers).content.decode()  # 抓取,转码

    # 用lxml解析网页结构
    html=etree.HTML(rh,etree.HTMLParser())

    a = html.xpath('//h3[@class="c-title"]/a//text()')  # 标题
#     b = html.xpath('//div[@class="c-title-author"]//text()') # 查询标题用:来源,时间
    b = html.xpath('//p[@class="c-author"]//text()') # 查询内容用:来源,时间

    # 一次采集1页,20条数据,全部插入到c中
    c.append({
        'title': a,  # 标题
        'content': b,  # 查询内容用:来源,时间
    })
    
    page += 20  # 1页20条新闻

c

Out[8]:

[{'title': ['\n      绍兴女子找男友却遇“',
   '旅行青蛙',
   '” 被骗感情被骗钱\n    ',
   '\n      春节已过 ',
   '旅行青蛙',
   '竟然成了"过去时"\n    ',
   '\n      《',
   '旅行青蛙',
   '》吸引春节期间访日中国游客 制作负责人:青蛙先要逛遍...\n    ',
   '\n      中国空巢青年催生"孤独经济" :',
   '旅行青蛙',
   '等火了\n    ',
   '\n      ',
   '旅行青蛙',
   '神秘人物怎么获得 ',
   '旅行青蛙',
   '夜晚模式怎么开启\n    ',
   '\n      本蛙忽然想出去浪——',
   '旅行青蛙',
   '该买辆啥车?\n    ',
   '\n      很遗憾,我终究也成为了一只“',
   '旅行青蛙',
  
   

列表或字典转为字符串并保存为json文本

In [9]:

json.dumps(c)  # 列表转字符串

with open("temp/a.json", "w", encoding='utf-8') as f:
    f.write(json.dumps(c))

读取JSON数据并转为列表或字典

In [10]:

with open("temp/a.json", "r", encoding='utf-8') as f:
    j = json.load(f)

j

Out[10]:

[{'title': ['\n      绍兴女子找男友却遇“',
   '旅行青蛙',
   '” 被骗感情被骗钱\n    ',
   '\n      春节已过 ',
   '旅行青蛙',
   '竟然成了"过去时"\n    ',
   '\n      《',
   '旅行青蛙',
   '》吸引春节期间访日中国游客 制作负责人:青蛙先要逛遍...\n    ',
   '\n      中国空巢青年催生"孤独经济" :',
   '旅行青蛙',
   '等火了\n    ',
   '\n      ',
   '旅行青蛙',
   '神秘人物怎么获得 ',
   '旅行青蛙',
   '夜晚模式怎么开启\n    ',
   '\n      本蛙忽然想出去浪——',
   '旅行青蛙',
   '该买辆啥车?\n    ',
   '\n      很遗憾,我终究也成为了一只“',
   

In [11]:

type(j)

Out[11]:

list

数据规整

字符串类数据清洗,操作繁杂,建议使用原生Python来处理

In [12]:

# 标题字符串规整

a2 = []
    
for i in j:
#     print(i)
    # 标题字符串规整,放入列表a2
    aa = ','.join(i['title']).replace(',', '').split('\n')  # 列表合为字符串,去除逗号和换行符
#     print(aa)
    for i in aa:
        i2 = i.strip()  # 删除字符串前后空值
        if i2 != '':  # 去除空列表值
            a2.append(i2)
a2

Out[12]:

['绍兴女子找男友却遇“旅行青蛙” 被骗感情被骗钱',
 '春节已过 旅行青蛙竟然成了"过去时"',
 '《旅行青蛙》吸引春节期间访日中国游客 制作负责人:青蛙先要逛遍...',
 '中国空巢青年催生"孤独经济" :旅行青蛙等火了',
 '旅行青蛙神秘人物怎么获得 旅行青蛙夜晚模式怎么开启',
 '本蛙忽然想出去浪——旅行青蛙该买辆啥车?',
 '很遗憾我终究也成为了一只“旅行青蛙”',
 '《旅行青蛙》蜗牛蜜蜂客人们怎么招待 汉化版中文翻译攻略汇总',
 '你还在养《旅行青蛙》?你不知道养的其实是只“猫”吗!',
 '国内为何做不出旅行青蛙?独立游戏难离商业化',
 '如果送旅行青蛙一份年货你猜小编会怎么送?',
 '真正养一只旅行青蛙你需要给他配一辆什么样子的车',

In [13]:

len(a2)

Out[13]:

503

In [14]:

# 来源和时间字符串规整,放入列表b2
b2 = []

for i in j:
    for i2 in i['content']:
        # 过滤和替换掉相应字符,字符串转列表,二维
        i3 = i2.replace('\xa0',' ').replace('\t', '').replace('\n', '').replace('年', '-').replace('月', '-').replace('日', '').split(' ')  # 去除各种空值,转为列表
#         print(i3)
        # 删除列表空值
        while '' in i3:
            i3.remove('')

        # 去掉 两种 列表,只存储 来源、日期、时间三种数据
        if i3 != ['查看更多相关新闻>>'] and i3 != []:
            b2.append(i3)

b2

Out[14]:

[['腾讯大浙网', '2018-02-23', '08:01'],
 ['人民网', '2018-02-22', '09:03'],
 ['大众网', '2018-02-21', '22:47'],
 ['站长网', '2018-02-21', '15:45'],
 ['蚕豆网', '2018-02-18', '14:14'],
 ['易车网', '2018-02-17', '07:48'],
 ['游民星空', '2018-02-14', '15:45'],
 ['九游网', '2018-02-13', '17:45'],
 ['站长之家', '2018-02-12', '14:30'],
 ['07073游戏网', '2018-02-12', '08:41'],
 ['网易', '2018-02-12', '06:41'],
 ['易车网', '2018-02-10', '13:41'],
 ['新浪', '2018-02-10', '08:48'],
 ['澎湃新闻', '2018-02-10', '07:05'],
 ['厦门网', '2018-02-10', '07:01'],
 ['新浪', '2018-02-09', '08:39'],
 ['思客', '2018-02-09', '06:30'],
 ['蚕豆网', '2018-02-08', '17:44'],
 ['蚕豆网', '2018-02-08', '17:08'],
 ['蚕豆网', '2018-02-08', '16:58'],
 ['太平洋电脑网', '2018-02-08', '11:20'],
 ['手机游戏网', '2018-02-08', '10:57'],
 

In [15]:

len(b2)

Out[15]:

503

In [16]:

# 将两个列表值合并入列表c,内层字典存储上面数据
#     print(len(a2), len(b2))
#     print(a2)

c = []

if len(a2) == len(b2):  # 俩列表长度相同否则退出
    for i in range(len(b2)):  # 遍历b2内值
        # 合并两个列表
#             print(b2[i])
        if len(b2[i]) == 3:
            c.append({
                    'id': i,
                    'title': a2[i],  # 标题
                    'source': b2[i][0],  # 来源
                    'date': b2[i][1],  # 日期
                    'time': b2[i][2],  # 时间
            })
        else:
            print(i, '注意:来源列表长度不是3个值,不会写入数据中!')

else:  # 长度不一致,错误
    print('标题和来源列表长度不一致,错误!')
    # 如出现错误可能是抓取问题,可以重新抓取数据后再测试
    
c

Out[16]:

[{'id': 0,
  'title': '绍兴女子找男友却遇“旅行青蛙” 被骗感情被骗钱',
  'source': '腾讯大浙网',
  'date': '2018-02-23',
  'time': '08:01'},
 {'id': 1,
  'title': '春节已过 旅行青蛙竟然成了"过去时"',
  'source': '人民网',
  'date': '2018-02-22',
  'time': '09:03'},
 {'id': 2,
  'title': '《旅行青蛙》吸引春节期间访日中国游客 制作负责人:青蛙先要逛遍...',
  'source': '大众网',
  'date': '2018-02-21',
  'time': '22:47'},
 {'id': 3,
  'title': '中国空巢青年催生"孤独经济" :旅行青蛙等火了',
  'source': '站长网',
  'date': '2018-02-21',
  'time': '15:45'},
 {'id': 4,
  'title': '旅行青蛙神秘人物怎么获得 旅行青蛙夜晚模式怎么开启',
  'source': '蚕豆网',
  'date': '2018-02-18',
  'time': '14:14'},
 {'id': 5,
  'title': '本蛙忽然想出去浪——旅行青蛙该买辆啥车?',
  'source': '易车网',
  'date': '2018-02-17',
  'time': '07:48'},
 {'id': 6,
  'title': '很遗憾我终究也成为了一只“旅行青蛙”',
  'source': '游民星空',
  'date': '2018-02-14',
  'time': '15:45'},
 {'id': 7,
  'title': '《旅行青蛙》蜗牛蜜蜂客人们怎么招待 汉化版中文翻译攻略汇总',
  'source': '九游网',
  'date': '2018-02-13',
  'time': '17:45'},
 {'id': 8,
  'title': '你还在养《旅行青蛙》?你不知道养的其实是只“猫”吗!',
  'source': '站长之家',
  'date': '2018-02-12',
  'time': '14:30'},
 {'id': 9,
  'title': '国内为何做不出旅行青蛙?独立游戏难离商业化',
  'source': '07073游戏网',
  'date': '2018-02-12',
  'time': '08:41'},
 {'id': 10,
  'title': '如果送旅行青蛙一份年货你猜小编会怎么送?',
  'source': '网易',
  'date': '2018-02-12',
  'time': '06:41'},
 {'id': 11,
  'title': '真正养一只旅行青蛙你需要给他配一辆什么样子的车',
  'source': '易车网',
  'date': '2018-02-10',
  'time': '13:41'},
 {'id': 12,
  'title': '《旅行青蛙》策划人:你家蛙不着家因为我做梦都在旅行',
  'source': '新浪',
  'date': '2018-02-10',
  'time': '08:48'},
 {'id': 13,
  'title': '人民日报谈“旅行青蛙”:“空巢青年”们的现实侧写',
  'source': '澎湃新闻',
  'date': '2018-02-10',
  'time': '07:05'},
 {'id': 14,
  'title': '人民日报谈“旅行青蛙”:“空巢青年”们的现实侧写_新闻中心_厦门网',
  'source': '厦门网',
  'date': '2018-02-10',
  'time': '07:01'},
 {'id': 15,
  'title': '彭博社探访《旅行青蛙》开发团队:创意者没写过代码',
  'source': '新浪',
  'date': '2018-02-09',
  'time': '08:39'},
 

In [17]:

len(c)

Out[17]:

503

In [18]:

# 转DataFrame
content = pd.DataFrame(c)
content.head()

Out[18]:

date id source time title
0 2018-02-23 0 腾讯大浙网 08:01 绍兴女子找男友却遇“旅行青蛙” 被骗感情被骗钱
1 2018-02-22 1 人民网 09:03 春节已过 旅行青蛙竟然成了"过去时"
2 2018-02-21 2 大众网 22:47 《旅行青蛙》吸引春节期间访日中国游客 制作负责人:青蛙先要逛遍...
3 2018-02-21 3 站长网 15:45 中国空巢青年催生"孤独经济" :旅行青蛙等火了
4 2018-02-18 4 蚕豆网 14:14 旅行青蛙神秘人物怎么获得 旅行青蛙夜晚模式怎么开启

In [19]:

content.shape

Out[19]:

(503, 5)

保存数据

In [20]:

content.to_csv('data/content.csv', index=False) 

读取数据

In [21]:

content = pd.read_csv(
    'data/content.csv',
#     parse_dates={'s': ['date','time']},  # 将两列合并解析为时间格式,自定义列名,为配合百度指数时间,这里不合并
    parse_dates=['date'],
    
).set_index('date').sort_index()  # 将date2设为行索引,并排序

content.head()

Out[21]:

id source time title
date
2017-09-07 502 闽南网 00:00 旅行青蛙汉化版哪里可以下载?旅行青蛙中文版下载方法(安卓)
2017-11-29 501 蚕豆网 00:00 旅行青蛙游戏攻略大全 青蛙旅行中文汉化翻译
2017-12-12 500 蚕豆网 00:00 旅行青蛙怎么和母青蛙合影 和母青蛙合影条件一览
2017-12-13 499 蚕豆网 00:00 旅行青蛙蜗牛喜欢吃什么 旅行青蛙怎么玩
2017-12-13 498 蚕豆网 00:00 旅行青蛙四叶草怎么用 旅行青蛙四叶草使用方法详解

In [22]:

content.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 503 entries, 2017-09-07 to 2018-02-23
Data columns (total 4 columns):
id        503 non-null int64
source    503 non-null object
time      503 non-null object
title     503 non-null object
dtypes: int64(1), object(3)
memory usage: 19.6+ KB

数据获取完成


相关文章

网友评论

    本文标题:产品推广策略数据分析 - 数据获取

    本文链接:https://www.haomeiwen.com/subject/ligflqtx.html