php抓取网页动态数据(娱乐小编是如何报道娱乐热点的?(一)(组图))

优采云 发布时间: 2021-10-23 12:10

  php抓取网页动态数据(娱乐小编是如何报道娱乐热点的?(一)(组图))

  八卦是人的本性。作为众多吃瓜群众中的一员,我当然不会放过娱乐圈的每一个热点。

  接下来就抢企鹅娱乐版块

  看看娱乐编辑如何报道娱乐热点。

  具体目标如下:(红框标题)

  

  第一步是“观察与分析”,一直向下滚动,右键查看源码,右键查看,这些是基本操作,可以发现网站是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用于绘图。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线