产品推广策略数据分析 - 数据获取
具体实施:
根据百度指数热门程度直观分析,
抓取百度新闻 旅行青蛙 (按内容查询,按时间排序)关键字的文字标题和相关信息,
时间从 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
数据获取完成









网友评论