当前位置: 首页 > news >正文

【实用工具系列之爬虫】python爬取资讯数据

系列

1.【实用工具系列之爬虫】python实现爬取代理IP(防 ‘反爬虫’)
2.【实用工具系列之爬虫】python爬取资讯数据


前言

在大数据架构中,数据收集与数据存储占据了极为重要的地位,可以说是大数据的核心基础。而爬虫技术在这两大核心技术层次中占有了很大的比例。

本文实现一种简单快速的爬虫方法,其中用了代理ip,代理ip的获取可以参考我的这篇文章 【实用工具系列之爬虫】python实现爬取代理IP(防 ‘反爬虫’)。

szZack的文章


代理IP

代理IP网站:xicidaili

具体方法详见 【实用工具系列之爬虫】python实现爬取代理IP(防 ‘反爬虫’) 。
输出的代理ip数据保存到 ‘proxy_ip.pkl’


爬取数据代码

本文以爬取小量财经数据为例子。

  • 网站

    • 地址:http://xxx

    • 爬取内容
      url,title,click_number,html_content

    • 保存数据为csv,格式如下:
      url,title,click_number,html_content,crawl_time
      szZack的文章

  • 实战

    • 步骤:
      1、爬取首页,提取url作为第一层
      2、爬取第一层的url,作为第二层
      3、爬取第二层的url,作为第三层
      4、结束
  • 环境

    • pandas
    • python3
    • Ubuntu16.04
    • requests

  • 代码
    crawl_finance_news.py
  • 1、导入依赖包
import crawl_proxy_ip
import pandas as pd
import re, time, sys, os, random
import telnetlib
import requests

  • 2.全局变量
global url_set
url_set = {}
  • 3.爬取核心代码
def crawl_finance_news(start_url):
    
    #提取数据格式:url,title,click_number,html_content,crawl_time
    
    proxy_ip_list = crawl_proxy_ip.load_proxy_ip('proxy_ip.pkl')
    
    #爬取首页
    start_html = crawl_web_data(start_url, proxy_ip_list)
    #open('tmp.txt', 'w').write(start_html)
    global url_set
    url_set[start_url] = 0
    
    #提取第一层web
    web_content_list = extract_web_content(start_html, proxy_ip_list)
    
    #提取第二层web
    length = len(web_content_list)
    for i in range(length):
        if len(web_content_list[i][2]) == 0:
            html = crawl_web_data(web_content_list[i][0], proxy_ip_list)
            web_content_list += extract_web_content(html, proxy_ip_list)
            if len(web_content_list) > 1000:#仅仅是测试
                break
    
    #提取第3层web
    length = len(web_content_list)
    for i in range(length):
        if len(web_content_list[i][2]) == 0:
            html = crawl_web_data(web_content_list[i][0], proxy_ip_list)
            web_content_list += extract_web_content(html, proxy_ip_list)
            if len(web_content_list) > 1000:#仅仅是测试
                break
            
    #保存数据
    columns = ['url', 'title', 'click_number', 'html_content', 'crawl_time']
    df = pd.DataFrame(columns = columns, data = web_content_list)
    df.to_csv('finance_data.csv', encoding='utf-8')
    print('data_len:', len(web_content_list))
    
    
def crawl_web_data(url, proxy_ip_list):

    proxy_ip_dict = random.choice(proxy_ip_list)
    if len(proxy_ip_list) == 0:
        return ''
    proxy_ip_dict = proxy_ip_list[0]
    
    try:
        html = download_by_proxy(url, proxy_ip_dict)
        print(url, 'ok')
            
    except Exception as e:
        #print('50 e', e)
        #删除无效的ip
        index = proxy_ip_list.index(proxy_ip_dict)
        proxy_ip_list.pop(index)
        print('proxy_ip_list', len(proxy_ip_list))
       	
        return crawl_web_data(url, proxy_ip_list)
        
    return html
    

def download_by_proxy(url, proxies):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.103 Safari/537.36', 'Connection':'close'}
    response = requests.get(url=url, proxies=proxies, headers=headers, timeout=10)
    response.encoding = 'utf-8'
    html = response.text
    return html
    

def extract_web_content(html, proxy_ip_list):

    #提取数据格式:url,title,click_number,html_content, crawl_time
    
    web_content_list = []
    
    html_content = html
    html = html.replace(' target ="_blank"', '')
    html = html.replace(' ', '')
    html = html.replace('\r', '')
    html = html.replace('\n', '')
    html = html.replace('\t', '')
    html = html.replace('"target="_blank', '')
    
    #<h3><a href="xxx/a/123.html" >证监会:拟对证券违法行为提高刑期上限</a></h3>
    res = re.search('href="(http[^"><]*finance[^"><]*)">([^<]*)<', html)#finance 必须是金融资讯
    while res is not None:
        url, title = res.groups()
        #print('url, title', url, title)
        global url_set
        if url in url_set:#防止重复
            html = html.replace('href="%s">%s<' %(url, title), '')
            res = re.search('href="(http[^"><]*finance[^"><]*)">([^<]*)<', html)
            continue
            
        else:
            url_set[url] = 0
        click_number = get_click_number(url, proxy_ip_list)
        #print('click_number', click_number)
        now_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        if len(click_number) == 0:#仅保留正文
            html_content = ''
        web_content_list.append([url, title, click_number, html_content, now_time])
        if len(web_content_list) > 200:#test 每页最多爬取200条
            break
        
        html = html.replace('href="%s">%s<' %(url, title), '')
        res = re.search('href="(http[^"><]*finance[^"><]*)">([^<]*)<', html)
        
    return web_content_list
    [szZack的文章](https://blog.csdn.net/zengNLP?type=blog)
    
def get_click_number(url, proxy_ip_list):
    
    html = crawl_web_data(url, proxy_ip_list)
    #<span class="num ml5">4297</span>
    res = re.search('<span class="num ml5">(\d{1,})</span>', html)
    if res is not None:
        return res.groups()[0]
        
    return ''
    
  • 4.测试
if __name__ == '__main__':
    
    #xx网:xxx/
    #用法:python crawl_finance_news.py 'xxx/'
    if len(sys.argv) == 2:
        crawl_finance_news(sys.argv[1])
        
  • 5.代码说明
    1、先爬取代理ip:python crawl_proxy_ip.py
    2、爬取财经新闻:python crawl_finance_news.py ‘xxx/’
    3、这里仅仅是测试,爬取1000条就结束
    4、数据保存到:finance_data.csv
    szZack的文章

  • 6.爬取内容示意
    在这里插入图片描述

szZack的文章

相关文章:

  • 易基因|植物育种:ChIP-seq(组蛋白)揭示H3K36me修饰影响温度诱导的植物可变剪接和开花
  • java计算机毕业设计计算机组成原理教学演示软件源码+数据库+系统+lw文档+mybatis+运行部署
  • Elasticsearch:简体繁体转换分词器 - STConvert analysis
  • C语言经典算法实例1:求二维数组最大最小值
  • 【C++入门基础】命名空间 | 缺省参数 | 函数重载 | 引用 | 内联函数
  • VMware安装与配置Linux 虚拟机
  • Code For Better 谷歌开发者之声——我与Android同成长
  • 【深度学习】(五)目标检测——下篇
  • web前端面试高频考点——Vue3.0新增API(生命周期,ref、toRef 和 toRefs 的理解和最佳使用方式)
  • 管理经济学--重点
  • Java学习路线(个人学习总结)
  • 【数据结构】跳表SkipList代码解析(C++)
  • 中医治疗特发性震颤,哪些食物不能吃?
  • 2022 创业方向指南
  • 11.vue3组件化开发(父子组件之间的通信)
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 《深入 React 技术栈》
  • CAP 一致性协议及应用解析
  • Java的Interrupt与线程中断
  • JSDuck 与 AngularJS 融合技巧
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • mockjs让前端开发独立于后端
  • mysql innodb 索引使用指南
  • mysql常用命令汇总
  • MySQL几个简单SQL的优化
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • PHP的类修饰符与访问修饰符
  • PHP那些事儿
  • Python_OOP
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • React-redux的原理以及使用
  • win10下安装mysql5.7
  • yii2权限控制rbac之rule详细讲解
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 驱动程序原理
  • 使用common-codec进行md5加密
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 小程序01:wepy框架整合iview webapp UI
  • 通过调用文摘列表API获取文摘
  • ​马来语翻译中文去哪比较好?
  • # include “ “ 和 # include < >两者的区别
  • #if #elif #endif
  • #考研#计算机文化知识1(局域网及网络互联)
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (算法)Game
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .gitignore文件忽略的内容不生效问题解决
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET 药厂业务系统 CPU爆高分析
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET是什么