c++ 爬虫

这是一个简单的c++爬虫,效率并不是很高...

 1 #include<stdio.h>
 2 int s1[1000000],s2[1000000];
 3 void fun(int a, int b)
 4 {
 5     int i,ii;
 6     bool t1,t2,t3,t4;
 7     s1[0] = s2[0] = s1[1] = s2[1] = 0;
 8     for(i=a; i <= b; i++){
 9         ii = i;
10         t1 = t2 = t3 = t4 =false;
11         while(ii != 0 ){
12             int a = ii %10;
13             if( a == 5)
14             {
15                 t1 = true;
16             }
17             else if( a == 2)
18             {
19                 t2 = true;
20             }
21             else if( a == 1)
22             {
23                 t3 = true;
24             }
25             ii = ii / 10;
26         }
27         if(t1 && t2 && t3){
28             s1[i-1] = s1[i-2] + 1;
29             ii = i;
30         while(ii != 0 ){
31             int a = ii % 10;
32             int b = (ii / 10) % 10;
33             int c = (ii / 100) % 10;
34             if( c > 0 && a == 1 && b == 2 && c ==5)
35                 t4 = true;
36             ii = ii / 10;
37         }
38         if(t4)
39             s2[i-1] = s2[i-2] + 1;
40         else
41             s2[i-1] = s2[i-2];
42         }
43         else{
44             s2[i-1] = s2[i-2];
45             s1[i-1] = s1[i-2];
46         }
47     }
48 }
49
50 int main()
51 {
52     int a,b,i=1;
53     fun(2,1000000);
54     while(scanf("%d%d",&a,&b) != EOF){
55         if(a == 1)
56             printf("Case %d:%d %d\n",i,s1[b-1]-s1[a-1],s2[b-1]-s2[a-1]);
57         else
58             printf("Case %d:%d %d\n",i,s1[b-1]-s1[a-2],s2[b-1]-s2[a-2]);
59         i++;
60     }
61     return 0;
62 }

 1 #include"urlThread.h"
 2 #include<QFile>
 3 #include<QMessageBox>
 4 #include<QTextStream>
 5 #include <QMainWindow>
 6 void urlThread::run()
 7 {
 8     open();
 9 }
10
11 void urlThread::startThread()
12 {
13     start();
14 }
15
16 //显示找到的url
17 void urlThread::open()
18 {
19     QString path = "url.txt";
20     QFile file(path);
21     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
22        // QMessageBox::warning(this,tr("Read File"),
23         //                     tr("Cannot open file:\n%1").arg(path));
24         send("error!cannot open url.txt!");
25         return;
26     }
27     QTextStream in(&file);
28     while(in.readLine().compare("") != 0){
29         //ui->textBrowser->append(in.readLine());
30         send(q2s(in.readLine()));
31         Sleep(1);
32     }
33     file.close();
34 }

 1 #include "mainwindow.h"
 2 #include <QApplication>
 3
 4 int main(int argc, char *argv[])
 5 {
 6     QApplication a(argc, argv);
 7     MainWindow w;
 8     w.setWindowTitle("小小爬虫");
 9     w.show();
10
11     return a.exec();
12 }

 1 #include "mainwindow.h"
 2 #include "ui_mainwindow.h"
 3
 4 MainWindow::MainWindow(QWidget *parent) :
 5     QMainWindow(parent),
 6     ui(new Ui::MainWindow)
 7 {
 8     ui->setupUi(this);
 9     QObject::connect(ui->start,SIGNAL(released()),this,SLOT(beginGeturl()));
10     //QObject::connect(ui->display,SIGNAL(released()),this,SLOT(open()));
11     QObject::connect(ui->display,SIGNAL(released()),&uth,SLOT(startThread()));
12     QObject::connect(&uth,&urlThread::sendMessage,this,&MainWindow::receiveMessage);
13     QObject::connect(&crawler,&Crawler::sendMessage,this,&MainWindow::receiveMessage);
14 }
15
16 MainWindow::~MainWindow()
17 {
18     delete ui;
19 }
20
21 void MainWindow::receiveMessage(const QString name)
22 {
23     ui->textBrowser->append(name);
24     ui->textBrowser->moveCursor(QTextCursor::End);
25 }
26
27 void MainWindow::open()
28 {
29     QString path = "url.txt";
30     QFile file(path);
31     if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
32         QMessageBox::warning(this,tr("Read File"),
33                              tr("Cannot open file:\n%1").arg(path));
34         return;
35     }
36     QTextStream in(&file);
37     while(in.readLine().compare("") != 0){
38         //ui->textBrowser->append(in.readLine());
39         crawler.send(q2s(in.readLine()));
40     }
41     file.close();
42 }
43
44 void MainWindow::beginGeturl()
45 {
46     //crawler = new Crawler();
47     string url = "" ,dep, filter = "www";
48     if(!ui->site->text().isEmpty())
49         url = q2s(ui->site->text());
50     crawler.addURL(url);
51     int depth = 1;
52     if(!ui->depth->text().isEmpty())
53     {
54         url = q2s(ui->depth->text());
55         depth = atoi(url.c_str());
56     }
57     if(!ui->filter->text().isEmpty())
58         filter = q2s(ui->filter->text());
59     crawler.setJdugeDomain(filter);
60     crawler.setDepth(depth);
61     crawler.startThread();
62 }

 1 #ifndef CRAWLER_H
 2 #define CRAWLER_H
 3
 4 #include<set>
 5 #include<string>
 6 #include<queue>
 7 #include "winsock2.h"
 8 #include <iostream>
 9 #include <fstream>
10 #include <stdio.h>
11 #include<time.h>
12 #include<winsock.h>
13 #include<QThread>
14
15 #pragma comment(lib, "ws2_32.lib")
16 using namespace std;
17
18 bool ParseURL(const string & url, string & host, string & resource);
19 bool GetHttpResponse(const string & url, char * &response, int &bytesRead);
20 QString s2q(const string &s);
21 string q2s(const QString &s);
22
23 #define DEFAULT_PAGE_BUF_SIZE 1000000
24
25 class Crawler: public QThread
26 {
27     Q_OBJECT
28 private:
29     queue<string> urlWaiting;
30     set<string> urlWaitset;
31     set<string> urlProcessed;
32     set<string> urlError;
33     set<string> disallow;
34     set<string>::iterator it;
35     int numFindUrl;
36     time_t starttime, finish;
37     string filter;
38     int depth;
39
40 public:
41     Crawler(){  filter = "\0";numFindUrl = 0;}
42     ~Crawler(){}
43     void begin();
44     void setDepth(int depth);
45     void processURL(string& strUrl);
46     void addURL(string url);
47     void log(string entry, int num);
48     void HTMLParse(string & htmlResponse, const string & host);
49     bool getRobotx(const string & url, char * &response, int &bytesRead);
50     void setJdugeDomain(const string domain);
51     long urlOtherWebsite(string url);
52     void send(string s)
53     {
54         QString qs = s2q(s);
55         emit sendMessage(qs);
56     }
57 signals:
58     void sendMessage(const QString name);
59
60 public slots:
61         bool startThread();
62
63 protected:
64     void run();
65
66 };
67 #endif // CRAWLER_H

 1 #ifndef MAINWINDOW_H
 2 #define MAINWINDOW_H
 3
 4 #include <QMainWindow>
 5 #include<QFile>
 6 #include<QMessageBox>
 7 #include<QTextStream>
 8 #include<QLineEdit>
 9 #include<QDebug>
10 #include"crawler.h"
11 #include"urlThread.h"
12
13 namespace Ui {
14 class MainWindow;
15 }
16
17 class MainWindow : public QMainWindow
18 {
19     Q_OBJECT
20
21 public:
22     explicit MainWindow(QWidget *parent = 0);
23     ~MainWindow();
24     void receiveMessage(const QString name);
25
26 public slots:
27         void beginGeturl();
28         void open();
29
30 private:
31     Ui::MainWindow *ui;
32     Crawler crawler;
33     urlThread uth;
34 };
35
36 #endif // MAINWINDOW_H

 1 #ifndef URLTHREAD_H
 2 #define URLTHREAD_H
 3 #include"crawler.h"
 4
 5 class urlThread: public QThread
 6 {
 7     Q_OBJECT
 8 public slots:
 9         void startThread();
10         void open();
11         void send(string s)
12         {
13             QString qs = s2q(s);
14             emit sendMessage(qs);
15         }
16 signals:
17         void sendMessage(const QString name);
18 protected:
19         void run();
20 };
21
22 #endif // URLTHREAD_H

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <ui version="4.0">
  3  <class>MainWindow</class>
  4  <widget class="QMainWindow" name="MainWindow">
  5   <property name="geometry">
  6    <rect>
  7     <x>0</x>
  8     <y>0</y>
  9     <width>706</width>
 10     <height>381</height>
 11    </rect>
 12   </property>
 13   <property name="windowTitle">
 14    <string>MainWindow</string>
 15   </property>
 16   <widget class="QWidget" name="centralWidget">
 17    <widget class="QLabel" name="label">
 18     <property name="geometry">
 19      <rect>
 20       <x>10</x>
 21       <y>20</y>
 22       <width>54</width>
 23       <height>21</height>
 24      </rect>
 25     </property>
 26     <property name="text">
 27      <string>初始网址:</string>
 28     </property>
 29    </widget>
 30    <widget class="QLineEdit" name="site">
 31     <property name="geometry">
 32      <rect>
 33       <x>70</x>
 34       <y>20</y>
 35       <width>151</width>
 36       <height>20</height>
 37      </rect>
 38     </property>
 39     <property name="text">
 40      <string>http://www.scut.edu.cn</string>
 41     </property>
 42    </widget>
 43    <widget class="QLabel" name="label_2">
 44     <property name="geometry">
 45      <rect>
 46       <x>230</x>
 47       <y>20</y>
 48       <width>54</width>
 49       <height>21</height>
 50      </rect>
 51     </property>
 52     <property name="text">
 53      <string>搜索深度:</string>
 54     </property>
 55    </widget>
 56    <widget class="QLineEdit" name="depth">
 57     <property name="geometry">
 58      <rect>
 59       <x>290</x>
 60       <y>20</y>
 61       <width>51</width>
 62       <height>20</height>
 63      </rect>
 64     </property>
 65     <property name="text">
 66      <string>2</string>
 67     </property>
 68    </widget>
 69    <widget class="QLabel" name="label_3">
 70     <property name="geometry">
 71      <rect>
 72       <x>360</x>
 73       <y>20</y>
 74       <width>71</width>
 75       <height>21</height>
 76      </rect>
 77     </property>
 78     <property name="text">
 79      <string>过滤字符串:</string>
 80     </property>
 81    </widget>
 82    <widget class="QLineEdit" name="filter">
 83     <property name="geometry">
 84      <rect>
 85       <x>430</x>
 86       <y>20</y>
 87       <width>71</width>
 88       <height>20</height>
 89      </rect>
 90     </property>
 91     <property name="text">
 92      <string>scut</string>
 93     </property>
 94    </widget>
 95    <widget class="QPushButton" name="start">
 96     <property name="geometry">
 97      <rect>
 98       <x>510</x>
 99       <y>20</y>
100       <width>51</width>
101       <height>23</height>
102      </rect>
103     </property>
104     <property name="text">
105      <string>开始</string>
106     </property>
107    </widget>
108    <widget class="QPushButton" name="display">
109     <property name="geometry">
110      <rect>
111       <x>570</x>
112       <y>20</y>
113       <width>61</width>
114       <height>23</height>
115      </rect>
116     </property>
117     <property name="text">
118      <string>显示url</string>
119     </property>
120    </widget>
121    <widget class="QTextBrowser" name="textBrowser">
122     <property name="geometry">
123      <rect>
124       <x>10</x>
125       <y>60</y>
126       <width>671</width>
127       <height>271</height>
128      </rect>
129     </property>
130    </widget>
131   </widget>
132   <widget class="QMenuBar" name="menuBar">
133    <property name="geometry">
134     <rect>
135      <x>0</x>
136      <y>0</y>
137      <width>706</width>
138      <height>23</height>
139     </rect>
140    </property>
141   </widget>
142   <widget class="QToolBar" name="mainToolBar">
143    <attribute name="toolBarArea">
144     <enum>TopToolBarArea</enum>
145    </attribute>
146    <attribute name="toolBarBreak">
147     <bool>false</bool>
148    </attribute>
149   </widget>
150   <widget class="QStatusBar" name="statusBar"/>
151  </widget>
152  <layoutdefault spacing="6" margin="11"/>
153  <resources/>
154  <connections/>
155 </ui>

ui文件要自己设计

爬虫还有一些小问题,抓取的url content并不完全,某些地址还有一点小问题...

貌似博客园没有上传附件的地方?还是我没找到?希望得到提示~

c++ 爬虫

时间: 2024-11-05 18:56:43

c++ 爬虫的相关文章

开始我的Python爬虫学习之路

因为工作需要经常收集一些数据,我就想通过学爬虫来实现自动化完成比较重复的任务. 目前我Python的状况,跟着敲了几个教程,也算是懂点基础,具体比较深入的知识,是打算从做项目中慢慢去了解学习. 我是觉得如果一开始就钻细节的话,是很容易受到打击而放弃的,做点小项目让自己获得点成就感路才更容易更有信心走下去. 反正遇到不懂的就多查多问就对了. 知乎上看了很多关于入门Python爬虫的问答,给自己总结出了大概的学习方向. 基础: HTML&CSS,JOSN,HTTP协议(这些要了解,不太需要精通) R

爬虫难点分析

难点分析 1.网站采取反爬策略 2.网站模板定期变动 3.网站url抓取失败 4.网站频繁抓取ip被封 1.网站采取反爬策略 >网站默认对方正常访问的方式是浏览器访问而不是代码访问,为了防止对方使用大规模服务器进行爬虫从而导致自身服务器承受过大的压力,通常网站会采取反爬策略 根据这一特性,我们用代码模拟实现浏览器访问 2.网站模板定期变动-解决方案 >标签变动,比如<div>变动,那么我们不能把代码给写死了 (1)不同配置文件配置不同网站的模板规则 (2)数据库存储不同网站的模板规

爬虫——模拟点击动态页面

动态页面的模拟点击: 以斗鱼直播为例:http://www.douyu.com/directory/all 爬取每页的房间名.直播类型.主播名称.在线人数等数据,然后模拟点击下一页,继续爬取 #!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' """ 动态页面的模拟点击: 模拟点击斗鱼直播:http://www.douyu.com/directory/all 爬取每页房间名.直播类型.主播名称.在线人数

第三百二十三节,web爬虫,scrapy模块以及相关依赖模块安装

第三百二十三节,web爬虫,scrapy模块以及相关依赖模块安装 当前环境python3.5 ,windows10系统 Linux系统安装 在线安装,会自动安装scrapy模块以及相关依赖模块 pip install Scrapy 手动源码安装,比较麻烦要自己手动安装scrapy模块以及依赖模块 安装以下模块 1.lxml-3.8.0.tar.gz (XML处理库) 2.Twisted-17.5.0.tar.bz2 (用Python编写的异步网络框架) 3.Scrapy-1.4.0.tar.gz

Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?

最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效率中的差异,注释:在爬虫中我几乎没有使用任何计算性任务,为了探测异步的性能,全部都只是做了网络IO请求,就是说aiohttp把网页get完就程序就done了. 结果发现前者的效率比后者还要高.我询问了另外一位博主,(提供代码的博主没回我信息),他说使用concurrent.futures的话因为我全

Python爬虫从入门到放弃(十一)之 Scrapy框架整体的一个了解

这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider/tree/master/jobboleSpider 注:这个文章并不会对详细的用法进行讲解,是为了让对scrapy各个功能有个了解,建立整体的印象. 在学习Scrapy框架之前,我们先通过一个实际的爬虫例子来理解,后面我们会对每个功能进行详细的理解.这里的例子是爬取http://blog.jobb

简谈-网络爬虫的几种常见类型

众所周知,网络爬虫(或称为网络爬虫.网络蜘蛛.机器人)是搜索引擎最上游的一个模块,是负责搜索引擎内容索引的第一关. 很多人为了提高自己网站的索引量,都是去网上随便找一些爬虫工具来使用.但是很多人不知道,这些抓取网站的小爬虫是有各种各样的不同性格的. 常见的优秀网络爬虫有以下几种类型: 1.批量型网络爬虫:限制抓取的属性,包括抓取范围.特定目标.限制抓取时间.限制数据量以及限制抓取页面,总之明显的特征就是受限: 2.增量型网络爬虫(通用爬虫):与前者相反,没有固定的限制,无休无止直到抓完所有数据.

python爬虫 模拟登陆校园网-初级

最近跟同学学习爬虫的时候看到网上有个帖子,好像是山大校园网不稳定,用py做了个模拟登陆很有趣,于是我走上了一条不归路..... 先上一张校园网截图 首先弄清一下模拟登陆的原理: 1:服务器判定浏览器登录使用浏览器标识,需要模拟登陆 2: 需要post账号,密码,以及学校id python走起,我用的2.7版本,用notepad++写的,绑定python可以直接运行 由于是模拟网页登陆,需要导入urllib urllib2 cookielib库,前两个有与网页直接的接口,cookielib就是用来

爬虫的本质

w机器化的人,超越人. [初码干货]关于.NET玩爬虫这些事 - 初码 - 博客园 http://www.cnblogs.com/printhelloworld/p/6354085.htm "爬虫的本质是对目标WebServer页面行为和业务流程的精准分析,是对HTTP的深刻理解,是对正则.多线程等周边技术以及软件工程的灵活运用"

由爬虫引发的思考

前言 花了两天时间写一个简单的爬虫程序.目前所用的技术十分简单.就是获得目标页面的html文档内容,然后解析其中有用的内容.既没有实现模拟登陆,也没有任何防止反爬虫的措施,甚至没有使用多线程.不过在其中遇到的问题还是引发了我很多的思考与问题,比如爬虫的合法性问题以及爬虫的危害等.于是写下这篇文章记录一下.由于本人经验有限,引用参考了大量文章,有问题请指出. 爬虫的作用与危害 爬虫的作用 网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是