某目新闻热榜爬虫详解

549 阅读2分钟

今天更最后一篇热榜数据爬虫之后就换一种类型了,开始反爬讲解,不做整个网站的采集改重难点突破了,今天看看这个网站某目新闻,这个网站的新闻权重好像还口以昨天看到有人花钱搞这个。

image.png

  1. 话不多说直接开始,还是先分析一下网站结构,网站地址

image.png 打开网站就是数据列表页了,然后还是先抓一下翻页的包看看数据接口是什么样子的,向下面滚动最下面有加载更多数据就是翻页按钮了

image.png

image.png 可见数据就在这个接口中了这里有五个参数先不纠结着五个参数代表什么再翻一页看看参数变化能不能找到规律

image.png 可见五个参数只有pageNo变化了,这个代表页数其他不变就不管照抄就可以,再看一下详情页数据是什么样子的

image.png 链接中看到了id盲猜数据就子啊html中了,文章id也是在列表页的数据中的,那就拖了。

  1. 先请求数据列表页解析出来文章链接
headers = {
   'Accept': 'application/json, text/javascript, */*; q=0.01',
   'Accept-Language': 'zh-CN,zh;q=0.9',
   'Cache-Control': 'no-cache',
   'Connection': 'keep-alive',
   'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
   'Origin': 'http://www.ctdsb.net',
   'Pragma': 'no-cache',
   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36',
   'requestTime': '1683857127006',
   'token': 'c045cd68b0e78d342810c7b015dd82ff',
}

data = {
   'focusNo': '5',
   'publishFlag': '1',
   'pageNo': '3',
   'pageSize': '20',
   'column': '1476',
}

response = requests.post('http://yth.ctdsb.net/amc/client/listContentByColumn', headers=headers, data=data,
                        verify=False).json()['data']['contentList']
for res in response:
   contentId = res['contentId']
   channelId ='c'+ str(res['channelId'])
   creationTime = str(res['creationTime']).replace('-','')[:6]
   print(contentId,channelId,creationTime)
   url = f'http://www.ctdsb.net/{channelId}_{creationTime}/{contentId}.html'
   print(url)

image.png 再请求详情页并自动解析文章内容等信息

headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Accept-Language': 'zh-CN,zh;q=0.9',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36',
}

response = requests.get(url, headers=headers, verify=False)
Genera = GeneralNewsExtractor()
aa = Genera.extract(response.text)
print(aa)

image.png ok没什么问题