【Scrapy 五分钟撸网站】[科技行业新闻]Scrapy实战36氪全站数据抓取

目标网站介绍

36氪 36氪通过全面,独家的视角为用户深度剖析最前沿的资讯,致力于让一部分人先看到未来,内容涵盖快讯,科技,金融,投资,房产,汽车,互联网,股市,教育,生活,职场等,秉承着…
在这里插入图片描述

开始Scrapy

数据采集准备

1. 不了解5分钟快速抓网站思路的小伙伴先看
【Scrapy 五分钟撸网站】全站数据必备基础知识

2. 不了解数据抓取业务管理整理小伙伴先看
【Scrapy 五分钟撸网站】爬虫目标整理和数据准备

3. 不了解Scrapy模板量产的小伙伴先看(必看)
【Scrapy 五分钟撸网站】数据抓取项目框架通用模板

数据整理结果

1. 全频道Url获取地址
在这里插入图片描述

2. Excel保存截图
在这里插入图片描述

模板套用

Spider下的<项目>.py文件

1. 创建spider项目

scrapy genspider www_36kr_com " "

2. 整理全站css样式
先来看下页面的CSS样式,全站统一样式。
在这里插入图片描述

3. 修改www_36kr_com.py的的内容

这里将需要修改的地方进行说明,其他地方参考模板,不需修改。

  • 作用域&自定义说明
    allowed_domains = []
    web_name = "36氪"
  • 添加抓取数据信息
    start_menu = [
        # 全资讯频道第一页部分
        [
            {
    
    "channel_name": "最新", "url": "https://36kr.com/information/web_news/latest", },
            {
    
    "channel_name": "推荐", "url": "https://36kr.com/information/web_recommend", },
            {
    
    "channel_name": "创投", "url": "https://36kr.com/information/contact", },
            {
    
    "channel_name": "Markets", "url": "https://36kr.com/information/ccs", },
            {
    
    "channel_name": "汽车", "url": "https://36kr.com/information/travel", },
            {
    
    "channel_name": "科技", "url": "https://36kr.com/information/technology", },
            {
    
    "channel_name": "企服", "url": "https://36kr.com/information/enterpriseservice", },
            {
    
    "channel_name": "生活", "url": "https://36kr.com/information/happy_life", },
            {
    
    "channel_name": "创新", "url": "https://36kr.com/information/innovate", },
            {
    
    "channel_name": "房产", "url": "https://36kr.com/information/real_estate", },
            {
    
    "channel_name": "职场", "url": "https://36kr.com/information/web_zhichang", },
            {
    
    "channel_name": "其他", "url": "https://36kr.com/information/other", },
        ]
        # 动态加载部分,及后面的页码
        # 加载网址是 https://gateway.36kr.com/api/mis/nav/ifm/subNav/flow
        # 参数是 下面这样 需要后面页码自行整理
        # {"partner_id": "web", "timestamp": 1614135556442,
        #  "param": {"subnavType": 1, "subnavNick": "web_news", "pageSize": 30, "pageEvent": 1,
        #            "pageCallback": "eyJmaXJzdElkIjozMjIwNjQ1LCJsYXN0SWQiOjMyMjAyNjgsImZpcnN0Q3JlYXRlVGltZSI6MTYxNDEyMTg5ODE2NSwibGFzdENyZWF0ZVRpbWUiOjE2MTQwNzc5ODUwMDB9",
        #            "siteId": 1, "platformId": 2}}
    ]
  • 样式整理

整体网站数据列表有多少种样式就要做多少个parseX,并添加到

        parse_list = [
            self.parse1,  # 全资讯频道第一页部分
        ]
  • 标题&链接&封面
        Item_title = response.xpath('//div[@class="kr-shadow-content"]/div[2]/p/a/text()').extract()  # 文章标题列表
        Item_url = response.xpath('//div[@class="kr-shadow-content"]/div[2]/p/a/@href').extract()  # 文章链接列表

Spider下的parse_detail.py文件

1. 抓取详情页内容

修改列表数据详情页的CSS抓取样式
在这里插入图片描述

    # 处理详情页带格式,这里整个页面进行抓取
    item['content'] = ""
    if 'class="article-content"' in response.text and len(None2Str(item['content'])) < 5:
        item['content'] = response.xpath('//div[@class="article-content"]').extract_first()

2. 特别说明

有些网站的程序员丧心病狂到一定程度10个页面9种样式这种,由于我们不可能每个页面都打开看一下详情页的CSS格式,因此有个通用的解决办法。

  • 第一次抓取完内容之后打开MongoDB数据库执行下面的命令会把包含body的页面数据筛选出来,这些是没有根据指定样式抓取的数据,而是直接抓的全部页面的数据。
db.你的表名.find({content:/body/})

在这里插入图片描述

  • 打开任意的link循环处理详情页的内容直到mongo命令没有筛选出来内容为止即可。

猜你喜欢

转载自blog.csdn.net/qq_20288327/article/details/114013817