爬虫1000+个C程序

news2024/11/15 0:17:10

爬虫1000+个C程序

问题场景

由于实验需要,我需要1000+个elf文件,可是网络可获取的elf文件较少,c程序较多,所以首先下载c程序,之后gcc编译链接生成elf文件。我需要的C源码不是项目级别的,正常100行左右就可以的!

爬取c程序

一开始,我的爬虫水平以及爬取思路仅限于:给定一个URL,包含C源码网址,我查看网页源码,设计程序逐个爬虫,下载C程序至文件👍
最初选择的URL如下:
菜鸟|C语言练习实例
在这里插入图片描述
我设计了如下程序:

import os
import sys
import numpy as np
import tensorflow as tf
from sequence.data_process import *
from nn.wd_trainer import WassersteinTrainer
from nn.scale_model import ScaleModel
from config import *
from nn.optimizer import Optimizer
import random
import requests
from bs4 import BeautifulSoup
import re


def example_urls():
    url = 'https://www.runoob.com/cprogramming/c-100-examples.html'
    c = requests.get(url)
    c.encoding = "utf-8"
    html = c.text

    example_url = []
    soup = BeautifulSoup(html, features="html.parser")
    for i in range(1, 101):
        item = soup.find("a", title="C 语言练习实例"+str(i))
        attrs = item.attrs
        href = attrs['href']
        example_url.append(href)

    return example_url


if __name__ == '__main__':
    example_url = example_urls()
    # example_url = ['/cprogramming/c-exercise-example1.html', '/cprogramming/c-exercise-example2.html', '/cprogramming/c-exercise-example3.html', '/cprogramming/c-exercise-example4.html', ...]
    i = 0
    while i < 101:
        e_url = example_url[i-1]
        url = 'https://www.runoob.com'+e_url
        print('url:', url)
        c = requests.get(url)
        c.encoding = "utf-8"
        html = c.text

        soup = BeautifulSoup(html, features="html.parser")  # 加html.parse代表识别为html语言
        item_1 = soup.find("div", class_="example_code")
        if item_1 is None:
            item_1 = soup.find("pre")
        print("item:", item_1)
        d_1 = item_1.text.strip()
        with open("data/readelf/c_source/id:{}.c".format(str(i).zfill(4)), "w", encoding='utf-8') as f:
            f.write(d_1)
        f.close()
        i += 1
        break

在菜鸟官网,只可以下载C语言经典100例,与我需要爬取的数量相差较大!
我又开始寻找包含需要C源码的网址,一个只发布C源码的博主,我重写编写程序(我的代码就是这么的局限),又找到26个程序,我要这样一直查找下去吗?

BFS爬取c程序

打开CSDN,我就打开了新世界的大门,我不需要寻找一个包含许多C源码的网址,我可以任意访问一个URL,查找网页是否包含C代码,之后利用BFS的思想,依次访问该URL可以链接的下一级URL。我的思想与下面文章的思想不谋而合,这篇文章介绍得很具体,如下所示:
通用爬虫技术
通用爬虫技术(general purpose Web crawler)也就是全网爬虫。其实现过程如下。
第一,获取初始URL。初始URL地址可以由用户人为指定,也可以由用户指定的某个或某几个初始爬取网页决定。
第二,根据初始的URL爬取页面并获得新的URL。获得初始的URL地址之后,需要先爬取对应URL地址中的网页,接着将网页存储到原始数据库中,并且在爬取网页的同时,发现新的URL地址,并且将已爬取的URL地址存放到一个URL列表中,用于去重及判断爬取的进程。
第三,将新的URL放到URL队列中,在于第二步内获取下一个新的URL地址之后,会将新的URL地址放到URL队列中。
第四,从URL队列中读取新的URL,并依据新的URL爬取网页,同时从新的网页中获取新的URL并重复上述的爬取过程。
第五,满足爬虫系统设置的停止条件时,停止爬取。在编写爬虫的时候,一般会设置相应的停止条件。如果没有设置停止条件,爬虫便会一直爬取下去,一直到无法获取新的URL地址为止,若设置了停止条件,爬虫则会在停止条件满足时停止爬取。详情请参见图2-5中的右下子图。
通用爬虫技术的应用有着不同的爬取策略,其中的广度优先策略以及深度优先策略都是比较关键的,如深度优先策略的实施是依照深度从低到高的顺序来访问下一级网页链接。

在CSDN,若网页中包含C源码,其网页源码就包含code 标签,且class属性包含language-c,如下所示:
<code class="prism language-c has-numbering" onclick="mdcp.copyCode(event)" style="position: unset;">

我编写的代码如下,其中BFS部分我参考了如下链接:
BFS详解及代码参考

import os
import sys
import numpy as np
import tensorflow as tf
from sequence.data_process import *
from nn.wd_trainer import WassersteinTrainer
from nn.scale_model import ScaleModel
from config import *
from nn.optimizer import Optimizer
import requests
from bs4 import BeautifulSoup
import re


headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'}

# 已访问过的URL集合
url_set = {}


def is_visit(url_set, url):
    if url_set.get(url) is None:
        return False
    else:
        return True


def c_source(url, i):
    c = requests.get(url, headers=headers, timeout=30)
    c.encoding = "utf-8"
    html = c.text

    soup = BeautifulSoup(html, features="html.parser")
    items = soup.find_all("code", attrs={"class": "language-c"})
    
    for item in items:
        c_source = item.text.strip()
        with open("data/readelf/c_source/id:{}.c".format(str(i).zfill(4)), "w", encoding='utf-8') as f:
            f.write(c_source)
        f.close()
        i += 1
    return i


def neighbor(url):
    c = requests.get(url, headers=headers, timeout=30)
    c.encoding = "utf-8"
    html = c.text

    neighbor_url = []
    soup = BeautifulSoup(html, features="html.parser")
    a_item = soup.find_all("a")
    for a in a_item:
        href = a.get("href")
        if href is None:
            continue
        if href.find("blog.csdn.net") != -1 and href.find("article") != -1 and href.find("details") != -1:
            neighbor_url.append(href)            
    return neighbor_url


# 输入一个起始点 URL
def BFS(url, i):
    # 创建队列
    queue = []
    
    # queue.append(url)
    url_set[url] = 1
    neighbor_url = neighbor(url)
    # 遍历neighbor_url中的元素
    for n_url in neighbor_url:
        # 如果n_url没访问过
        if not is_visit(url_set, n_url):
            queue.append(n_url)

    # 当队列不空的时候
    while len(queue) > 0:
        # 将队列的第一个元素读出来
        url = queue.pop(0)
        print("url:", url)
        neighbor_url = []
        new_i = c_source(url, i)
        if new_i > i:
            neighbor_url = neighbor(url)
            i = new_i
        
        # 加入url_set表示url我们访问过
        url_set[url] = 1

        # 遍历neighbor_url中的元素
        for n_url in neighbor_url:
            # 如果n_url没访问过
            if not is_visit(url_set, n_url):
                queue.append(n_url)
        if i > 7000:
            break


if __name__ == '__main__':
    # 广度优先搜索
    i = 0
    url = "https://blog.csdn.net/nav/algo"
    BFS(url, i)

下面是我爬取的C文件,存在许多片段代码,以及C++代码,所以建议大家发布博客时对应语言的代码使用对应的代码块!
在这里插入图片描述
在这里插入图片描述

c程序 gcc 为elf文件

import os
import sys
import numpy as np
import tensorflow as tf
from sequence.utils import *
from sequence.data_process import *
from nn.wd_trainer import WassersteinTrainer
from nn.scale_model import ScaleModel
from config import *
from nn.optimizer import Optimizer
import random
import requests
from bs4 import BeautifulSoup
import re


def subprocess_call(cmd: str, encoding="utf-8"):
    """
    开一个子进程执行命令, 并返回结果, 命令和返回结果的编码默认为utf-8编码.

    Args:
        cmd (str): 命令内容
        encoding (str): 编码格式
    Returns:
        Tuple[str, str]: (stdout, stderr)
    """
    try:
        p = subprocess.Popen(cmd,
                             shell=True,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.STDOUT,
                             encoding=encoding)
        result = p.communicate()
        p.terminate()
        return result
    except Exception as e:
        print(e)
    return None


if __name__ == '__main__':
    output_dir = OUTPUT_DIR
    format_dir = FORMAT_DIR
    c_dir = output_dir + '/c_source'
    cmd = "ls {}".format(c_dir)
    result = subprocess_call(cmd)
    split = result[0].split()
    # if there exists no files
    if len(split) == 0:
        print("Note: There exists no files!")
    print("文件数量:", len(split))
    
    i = 0
    while i <= 8005:
        file = split[i - 1]
        file_name = file.rstrip()
        file_path = "{}/{}".format(c_dir, file_name)
        outfile_name = 'org_elf:id:{}'.format(str(i).zfill(4))
        outfile_path = os.path.join(format_dir, outfile_name)
        print('file_path:', file_path)
        gcc_cmd = "gcc {} -o {}".format(file_path, outfile_path)
        # gcc c_source/id:0799.c -o format_set/org_elf:id:0001
        gcc_result = subprocess_call(gcc_cmd)
        # if gcc_result is not None:
        i += 1

上面代码中的gcc命令,如果不是c源码,就会产生编译错误,从而不会生成对应的ELF文件,我收集了8000个C程序,预处理之后保存下来1732个文件。

扩展

本文提出的方法同时可以适用于XML、C++和Java等文件,例如,我们可以修改code的属性为language-xml 进而完成下载XML文件。
本文的方法同时可以适用于PNG、JPEG文件的下载。PNG文件需要通过下载URL将文件保存至硬盘。
python requests库下载图片保存到本地
我的代码如下,思路与之前的代码一致:

import requests
from bs4 import BeautifulSoup
import re
from sequence.utils import *
from config import *

# 已访问过的URL集合
url_set = {}
format_dir = 'data/libpng/format_set'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'}


def is_visit(url_set, url):
    if url_set.get(url) is None:
        return False
    else:
        return True


# 单个img下载
def download_img(url, i):
    try:
        response = requests.get(url)
        # 获取的文本实际上是图片的二进制文本
        img = response.content

        # 保存路径 wb代表写入二进制文本
        path = '{}/org_png:id:{}'.format(format_dir, str(i).zfill(4))
        with open(path, 'wb') as f:
            f.write(img)
        f.close()
    except Exception as e:
        print(e)


def neighbor(a_items):
    neighbor_url = []
    for a in a_items:
        href = a.get("href")
        if href is None:
            continue
        if href[0] == '/':
            url = "https://pngpai.com" + href
            if not is_visit(url_set, url):
                neighbor_url.append(url)
    return neighbor_url


# 批量img下载
def png(queue, url, i):
    c = requests.get(url, headers=headers, timeout=30)
    c.encoding = "utf-8"
    html = c.text
    soup = BeautifulSoup(html, features="html.parser")
    url_set[url] = 1

    a_items = soup.find_all("a")
    neighbor_url = neighbor(a_items)
    for n_url in neighbor_url:
        # 如果n_url没访问过
        if not is_visit(url_set, n_url):
            queue.append(n_url)

    img_items = soup.find_all("img")
    for item in img_items:
        src = item.get('src')
        if src is None:
            continue
        if src[0] == '/':
            img_url = "https://pngpai.com" + src
        print("img_url:", img_url)
        if img_url.find('.png') != -1:
            download_img(img_url, i)
        i += 1
    return i


# 输入一个起始点 URL
def BFS(url, i):
    # 创建队列
    queue = []
    queue.append(url)

    # 当队列不空的时候
    while len(queue) > 0:
        # 将队列的第一个元素读出来
        url = queue.pop(0)
        print("url:", url)
        new_i = png(queue, url, i)
        if new_i > i:
            i = new_i
        if i > 2000:
            break


if __name__ == '__main__':
    url = "https://pngpai.com/"
    i = 1
    BFS(url, i)   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/420528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PNAS:土地利用和土地覆盖的变化决定了保护区的可持续性和影响

PNAS 中文题目&#xff1a; 土地利用和土地覆盖的变化决定了保护区的可持续性和影响 英文题目&#xff1a; Land-use and land-cover change shape the sustainability and impacts of protected areas 作者&#xff1a; Determinants and impacts of protected area remova…

MATLAB 神经网络变量筛选—基于BP的神经网络变量筛选(链接在文末)

灰色系统理论是一种研究少数据、贫信息、不确定性问题的新方法&#xff0c;它以部分信息已知&#xff0c;部分信息未知的“小样本”&#xff0c;“贫信息”不确定系统为研究对象&#xff0c;通过对“部分”已知信息的生成、开发&#xff0c;提取有价值的信息&#xff0c;实现对…

软考第六章 网络互连与互联网

网络互连与互联网 1.网络互连设备 组成因特网的各个网络叫做子网&#xff0c;用于连接子网的设备叫做中间系统。它的主要作用是协调各个网络的工作&#xff0c;使得跨网络的通信得以实现。 网络互连设备可以根据它们工作的协议层进行分类&#xff1a; 中继器&#xff1a;工…

双周赛102(模拟、BFS技巧、求最短路模板问题)

文章目录双周赛102[6333. 查询网格图中每一列的宽度](https://leetcode.cn/problems/find-the-width-of-columns-of-a-grid/)模拟[6334. 一个数组所有前缀的分数](https://leetcode.cn/problems/find-the-score-of-all-prefixes-of-an-array/)模拟(一次遍历)&#x1f62d;[6335…

【黑马】JavaWeb开发教程(涵盖Spring+MyBatis+SpringMVC+SpringBoot等)目录合集

​Java Web 传统路线&#xff1a; 课程讲述路线&#xff1a; 视频链接&#xff1a; 2023新版JavaWeb开发教程&#xff0c;实现javaweb企业开发全流程 学习时间&#xff1a; 断断续续&#xff0c;按照课程安排正常学习&#xff0c;历时15天&#xff0c;完结撒花&#xff01;…

快速认识并上手Eureka注册中心

文章目录一、初识Eureka1.1 EurekaServer1.2 EurekaClient1.2.1 EurekaClient中的角色二、EurekaServer2.1 搭建EurekaServer2.1.1 依赖引入2.1.2 添加注解2.1.3 配置eureka地址2.1.4 验证2.2 注册EurekaClient2.2.1 引入客户端依赖2.2.2 配置eureka地址2.2.3 验证2.3 服务发现…

【C++】多态---下(多态的原理)

前言&#xff1a; 在多态---上中我们了解了什么是多态&#xff0c;以及多态的使用条件等。本章将进行更深入的学习&#xff0c;我们详细理解多态的原理。 目录 &#xff08;一&#xff09;虚函数表 &#xff08;1&#xff09;虚函数表的引入 &#xff08;2&#xff09;虚表…

RHCE——时间服务器(ntp)

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 2.配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接 一.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 1、软件安装 [rootl…

宝可梦朱紫太晶化效果小记

首先&#xff0c;不得不吐槽一下&#xff0c;switch上这么多代宝可梦下来&#xff0c;好玩是好玩&#xff0c;但是整体效果和优化不能说糟烂&#xff0c;只能说稀碎。 看这个朱紫的截帧都给我看吐了&#xff0c;上点心啊老任 回到效果&#xff0c;首先是实现方式 主要有俩点 …

3.Earth Engine语法Javascript版(基本属性2)

1.地图MAp 1. Map.add(item)这个方法通常是在地图展示区加入各种ui使用&#xff0c;如ui.Label 2.Map.centerObject(object, zoom)设置地图居中位置&#xff0c;参数object是矢量数据或者影响数据&#xff1b;zoom是缩放级别。 3.Map.addLayer(ee.Object, visParams, name, …

树莓派利用python-opencv使用CSI摄像头调用监控视频

目录 一、安装python-opencv。 二、使用工具Xshell7和MobaXterm 三、连接并打开CSI摄像头 3.1连线如图所示&#xff1a; 3.2打开摄像头 四、编写摄像头代码调用摄像头 一、安装python-opencv。 一定要选择配置好的安装python-opencv&#xff0c;不要去配置安装&#xff0c…

012 - C++指针

本期我们将学习 C 中的指针。 指针是一个令很多人都很痛苦的内容&#xff0c;然而指针其实没有大家想象中的那么复杂。另外我先要说明本期我们要讨论的是原始的指针&#xff0c;还有一种常用的指针叫智能指针&#xff0c;这个我们在之后的内容中会接触学习。 计算机处理内存&…

LeetCode_二叉搜索树_中等_236.二叉搜索树的最近公共祖先

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 …

jQuery讲解|这一章就够了|(超详细|保姆级)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…

【设计模式】生产者消费者模型

带你轻松理解生产者消费者模型&#xff01;生产者消费者模型可以说是同步与互斥最典型的应用场景了&#xff01;文末附有模型简单实现的代码&#xff0c;若有疑问可私信一起讨论。 文章目录一&#xff1a;为什么要使用生产者消费者模型&#xff1f;二&#xff1a;生产者消费者模…

JDK 17:Java 17 中的新特性简介

Java 开发工具包 (JDK) 17 将是一个长期支持 (LTS) 版本&#xff0c;预计来自 Oracle 的扩展支持将持续数年。该功能集定于 6 月 10 日冻结&#xff0c;届时 JDK 17 将进入初始阶段。作为 OpenJDK JDK 17 的一部分提交的功能包括&#xff1a; 特定于上下文的反序列化过滤器允许…

计算机网络 实验一

⭐计网实验专栏&#xff0c;欢迎订阅与关注&#xff01; ★观前提示&#xff1a;本篇内容为计算机网络实验。内容可能会不符合每个人实验的要求&#xff0c;因此以下内容建议仅做思路参考。 一、实验目的 掌握在Packet Tracer软件中搭建实验平台&#xff0c;配置基本的网络参数…

8D和A3报告

8D和3A报告&#xff0c;他们都不仅仅是记录问题的一种文书&#xff0c;而是解决问题的工具。 A3发展于TPS &#xff08;Toyota Production system&#xff09;&#xff0c;可以用来解决问题&#xff0c;沟通&#xff0c;记录&#xff0c;是一种流程&#xff0c;当人们在使用A3…

MySQL中添加新字段

© Ptw-cwl 要在MySQL中添加新字段&#xff0c;您可以使用ALTER TABLE语句。 以下是添加新字段的基本语法&#xff1a; ALTER TABLE table_name ADD column_name datatype;其中&#xff1a; table_name 是您要在其中添加新字段的表的名称。column_name 是新字段的名称。…

Linux安装Anaconda

目录1.下载Anaconda的安装包2.安装Anaconda3.用conda创建虚拟环境4.安装项目依赖包1.下载Anaconda的安装包 首先需要在官网上选择需要安装的版本。 官网地址&#xff1a;https://repo.anaconda.com/archive/&#xff0c;如选择当前最新版本进行安装&#xff1a; https://repo.…