php抓取网页动态数据(娱乐小编是如何报道娱乐热点的?(一)(组图))
优采云 发布时间: 2021-10-23 12:10php抓取网页动态数据(娱乐小编是如何报道娱乐热点的?(一)(组图))
八卦是人的本性。作为众多吃瓜群众中的一员,我当然不会放过娱乐圈的每一个热点。
接下来就抢企鹅娱乐版块
看看娱乐编辑如何报道娱乐热点。
具体目标如下:(红框标题)
第一步是“观察与分析”,一直向下滚动,右键查看源码,右键查看,这些是基本操作,可以发现网站是ajax加载,还有返回的数据是Json,如下图:
然后就可以进行基本的爬取了,代码如下(文件名为news_of_ent_v1.py):
import requests
import json
import uagent #我自己编写的一个获取随机user-agent的脚本,可参考https://blog.csdn.net/eighttoes/article/details/82996377
url = ('https://pacaio.match.qq.com/irs/rcd?cid=146&token=49cbb2154853ef1a74ff4e5372337'
'2ce&ext=ent&page=3&expIds=20181129V094JT|20181129A09LA4|20181129A09DI3|h08046y2'
'39w|20181129A0AEFT|20181129A09L7P|20181129A0A0A3|w0804cm6v49|20181129A07WGU|201'
'81129V07R1F|20181129A07YTG|i0804um2sgw|20181129A03RFA|20181129V08K9U|20181129A0'
'752A|r0804pauuow|20181129A03M8L|20181129V05VUW|20181129A07RY8|i0804rrvezl&callb'
'ack=__jp9')
def get_page(url):
headers = {'User-Agent': uagent.get_ua()}
response = requests.get(url = url, headers = headers)
index = response.text.index('{')
text = response.text[index:-1] #因为返回的字符串不符合Json格式,所有需要截取
return text
def parse(text):
dic = json.loads(text)
for i in dic['data']:
title = i['title']
print(title)
if __name__ == '__main__':
text = get_page(url)
parse(text)
第三步,可以开始考虑如何从多个页面抓取数据。一般来说,你可以观察多个 URL 之间的规则。
| 20181129A0GCCJ | 20181129A0CWFL | m0804l0n718 | 20181129A0DXZT | 20181128A041V1 | 20181129A0BAHH | l0804e3dmbo | 20181129A0F6R9 | 20181129A0EESO | 20181127A154YM | l0804qtam7g | 20181129A0ETEU | 20181129A0H1J0 | 20181129V0EZAD | i0804iftf8b | 20181129A0HEU1 | 20181129A0HEA6 & 回调 = __ jp11
| 20181129A0H8CM | 20181129A0H6ZO | l0804e3dmbo | 20181129A0H6JU | 20181129A0H1D0 | 20181129A0H0VJ | o0804dfc16w | 20181129A0GU2A | 20181129A0GPHC | 20181129A0GJF9 | w08042hmn7v | 20181129A0GEM6 | 20181129A0GCE0 | 20181129A0GAW5 | p08042xdhx2 | 20181129A0G09R | 20181129A0FZKK & 回调 = __ jp12
| 20181129A0FAHO | 20181129A0F9F9 | u080493vmrd | 20181129A0F8SG | 20181129A0F8KW | 20181129A0DQ1O | g0804wb0r2h | 20181129A0DIMJ | 20181129A0DFVG | 20181129A044D0 | z080490ojod | 20181127V1HHOY | 20181129A0CZBG | 20181129A0B8NS | i0804ilfina | 20181129A0D98X | 20181129A0AOPL | 20181129V05VUW & 回调 = __ jp13
改变的url参数是page、expIds和callback。
页面和回调很好理解,它是越来越多的数字。至于expIds,这么大的清单是什么?我从刚刚抓取的 Json 数据中找到了线索。id 字段构成下一页 url 的键。信息。
然后就可以开始编辑代码了,如下图(文件名为news_of_ent_v2.py):
import requests
import json
import uagent #我自己编写的一个获取随机user-agent的脚本,可参考https://blog.csdn.net/eighttoes/article/details/82996377
def get_page(n, expIds): #page从1开始,callback = page + 6
base_url = 'https://pacaio.match.qq.com/irs/rcd'
payload = {
'cid': '146',
'token': '49cbb2154853ef1a74ff4e53723372ce',
'ext': 'ent',
'page': str(n),
'expIds': expIds,
'callback': '__jp' + str(n + 6)
}
headers = {'User-Agent': uagent.get_ua()}
response = requests.get(url = base_url, params = payload, headers = headers)
index = response.text.index('{')
text = response.text[index:-1] #因为返回的字符串不符合Json格式,所有需要截取
return text
def parse_title(text):
dic = json.loads(text)
for i in dic['data']:
title = i['title']
print(title)
def parse_id(text):
dic = json.loads(text)
expIds = ''
for i in dic['data']:
expIds += i['id']
expIds += '|'
return expIds[:-1]
if __name__ == '__main__':
expIds = ('20181129001615|20181129A0JFDT|20181128A0Z1JV|l0804gy5rsa|20181129A0K'
'LSB|20181129A0D0LP|20181129A02B6B|n0804d5mx3y|20181128A1K7IZ|20181129'
'A09LA4|20181129A060VB|s0804loccct|20181129A0KIZU|20181129A0AEFT|20181'
'129A0PGAG|w0804wyseww|20181129009640|20181129A0JLZQ|20181129A06G5R')
for n in range(1, 11):
text = get_page(n, expIds)
parse_title(text)
expIds = parse_id(text)
修改了get_page()函数,添加了构造url的逻辑,而不是直接把url当作参数传入,然后添加了一个解析expIds的函数。
第四步开始考虑保存数据,因为数据量不大,而且只有一个字段,直接保存为csv文件即可。
代码如下(文件名为news_of_ent_v3.py):
import requests
import json
import uagent #我自己编写的一个获取随机user-agent的脚本,可参考https://blog.csdn.net/eighttoes/article/details/82996377
import csv
def get_page(n, expIds): #page从1开始,callback = page + 6
base_url = 'https://pacaio.match.qq.com/irs/rcd'
payload = {
'cid': '146',
'token': '49cbb2154853ef1a74ff4e53723372ce',
'ext': 'ent',
'page': str(n),
'expIds': expIds,
'callback': '__jp' + str(n + 6)
}
headers = {'User-Agent': uagent.get_ua()}
response = requests.get(url = base_url, params = payload, headers = headers)
index = response.text.index('{')
text = response.text[index:-1] #因为返回的字符串不符合Json格式,所有需要截取
return text
def parse_title(text):
dic = json.loads(text)
titles = [i['title'] for i in dic['data']]
return titles
def parse_id(text):
dic = json.loads(text)
expIds = ''
for i in dic['data']:
expIds += i['id']
expIds += '|'
return expIds[:-1]
def save(data):
#encoding用一个比较大的汉字字符集,防止出现不能识别的汉字
with open('titles.csv', 'a', newline = '', encoding = 'GB18030') as c:
writer = csv.writer(c)
for i in data:
writer.writerow([i])
if __name__ == '__main__':
#这里对第一个expIds进行硬编码
expIds = ('20181129001615|20181129A0JFDT|20181128A0Z1JV|l0804gy5rsa|20181129A0K'
'LSB|20181129A0D0LP|20181129A02B6B|n0804d5mx3y|20181128A1K7IZ|20181129'
'A09LA4|20181129A060VB|s0804loccct|20181129A0KIZU|20181129A0AEFT|20181'
'129A0PGAG|w0804wyseww|20181129009640|20181129A0JLZQ|20181129A06G5R')
for n in range(1, 11):
text = get_page(n, expIds)
data = parse_title(text)
save(data)
print('the', n, 'page ok')
expIds = parse_id(text)
将parse_title()函数改为返回一个列表推导式,并新增了一个save()函数。
####一开始,我打算抓取10000页的数据,但是大约20页之后,每页的标题数量从20个下降到4-5个。一开始以为是反爬虫策略。,于是我用浏览器加载了一下,发现是一样的。
然后当脚本抓取大约 2000 页时,没有返回标题。我觉得应该是企鹅直接删除旧的过期缓存。普通人不会阅读一个版本的新闻,并将其降到 2000 个。多页。. .
这里我挖了3235个标题,这里做一个简单的分析。
首先,我发现作为专业编辑,起标题的时候一定不能用句号,但是可以用问号吗?还有感叹号!
而且你不能用几个简单的词来开始标题。标题一般比较长,需要用逗号拼接。
至于标题,字数一般控制在20-32左右,只有极少数的字出现在10以下或35字以上。
既然标题一定要跟内容相关,相信只要有初中语文水平的同学都会知道这个道理。
虽然这几年头条党很多,但是头条里的主角一般都不是假的,所以你可以通过头条看看这两天(我是18年11月29日写的这个博客)谁是10个最流行艺人?
可见,基本与昨天(2018年11月28日)的娱乐新闻密不可分。除了赵丽颖,我不知道发生了什么。. .
总结
通过分析Ajax,可以只使用requests和json库进行数据挖掘,使用csv库保存数据。
至于后面的数据可视化,pandas用于读取和操作csv,jieba用于分词,采集s中的Counter用于词频统计,plt用于绘图。