前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一键爬取新闻网站内容,深深的研读了.....

一键爬取新闻网站内容,深深的研读了.....

作者头像
Python与Excel之交
发布2021-08-05 14:54:06
9730
发布2021-08-05 14:54:06
举报
文章被收录于专栏:Python与Excel之交

Hi~大家好!

本文会简单的爬取澎湃新闻网站的时事中国政库新闻,其中会涉及concurrent并发的简单应用!

一、分析网页

网址:

代码语言:javascript
复制
https://www.thepaper.cn/list_25462

澎湃新闻的网站有点像梨视频网站,想要获取更多的内容需要鼠标往下拉才会显示,是经过动态渲染而成,所以需要进入浏览器的开发者工具→Network→XHR进行内容的抓包,得到了一条url。

打开该链接,得到的是一个简单静态网页:

每条链接的pageidx参数和lastTime参数会发生变化,其中pageidx参数每次变化会增加1lastTime是一个时间戳,这里不影响我们抓取内容,直接去掉就行了。

代码语言:javascript
复制
https://www.thepaper.cn/load_index.jsp?nodeids=25462&topCids=&pageidx=2&isList=true&lastTime=1616153518779
https://www.thepaper.cn/load_index.jsp?nodeids=25462&topCids=&pageidx=3&isList=true&lastTime=1616120430221

点开一条内容里面就是新闻信息了:

每条内容的链接都有特有的id值,所以需要获取其id值:

代码语言:javascript
复制
https://www.thepaper.cn/newsDetail_forward_11765286
https://www.thepaper.cn/newsDetail_forward_11763702

爬取思路:

  • 请求动态加载出的链接
  • 获取每条内容的特有的id值,拼接成内容的链接
  • 提取新闻内容进行保存
二、实战代码

导入模块:

代码语言:javascript
复制
import requests
import re
from lxml import etree
import concurrent.futures

请求函数:

代码语言:javascript
复制
def def_response(url_s):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    }
    response = requests.get(url_s, headers=headers)
    return response

保存函数:

代码语言:javascript
复制
def save(title_li, text):
 # 声明编码,不然会报错
    with open('./x.text', mode='a', encoding='utf-8')as f:
        f.write(title_li + '\n\n')
        f.write(text + '\n\n')
        # 因为保存在一个文件中,所以这里用*号进行隔开
        f.write('*' * 50 + '\n\n')#

解析函数:

代码语言:javascript
复制
def main(html_url):
    response = def_response(html_url)
    href = re.findall('data-id="(.*?)"', response.text)
    title = re.findall('alt="(.*?)"', response.text)
    for url_li, title_li in zip(href, title):
     # 拼接链接
        url_ = f'https://www.thepaper.cn/newsDetail_forward_{url_li}'
        res = def_response(url_)
        etrees = etree.HTML(res.text)
        # 这里用xpath提取文本内容,但是格式有点乱,所以用'\n\n'.join进行换行
        text = '\n\n'.join(etrees.xpath('.//div[@class="news_txt"]/text()'))
        save(title_li, text)

启动器 :

代码语言:javascript
复制
if __name__ == '__main__':
    # ThreadPoolExecutor 线程池的对象 max_workers  任务数 这里开了3个
    executor = concurrent.futures.ThreadPoolExecutor(max_workers=3)
    for page in range(0, 4):
        url = f'https://www.thepaper.cn/load_index.jsp?nodeids=25462&topCids=&pageidx={page}&isList=true'
        # main(url)
        # submit  往线程池里面添加任务
        executor.submit(main, url)
    executor.shutdown()

效果图:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与Excel之交 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、分析网页
  • 二、实战代码
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档