C/C++ | Qt 实现爬虫功能,爬取CSDN博客文章
2018-02-08 12:57
726 查看
话不多说,先看程序运行截图:
注意:
本人没有看过爬虫相关的书籍,第一次写这种程序,这个程序是半屌子的,原理很简单,没有学习过爬虫的朋友,也可以写。
程序思路如下:
1.下载要爬网站的页面。
2.用正则表达式去掉空格,使得程序处理得快。
3.因为CSDN博客文章前面的链接都一样,所以我们只要提取尾部文章编号。
(如:http://blog.csdn.net/qq78442761/article/details/xxxxxxxx)
4.扫描整个文件,得到文章标题。
5.保存为csv格式文件
源码下载如下链接:(还在审核,不知道能不能下载)
http://download.csdn.net/download/qq78442761/10245494
关于界面,在此不再说明。
来说下下载网页(此处只有伪代码,源码请从上面的链接下载):
void Widget::on_id_getWebCode_pushButton_clicked()
{
const QString URLSTR=ui->id_url_lineEdit->text();
const QString FILE_NAME=ui->id_SaveFileName_lineEdit->text();
QUrl url(URLSTR);
QEventLoop loop;
QNetworkAccessManager manager;
//发出请求
QNetworkReply *reply=manager.get(QNetworkRequest(url));
//请求结束并下载完成后,退出子事件循环
connect(reply,SIGNAL(finished()),&loop,SLOT(quit()),Qt::UniqueConnection);
//开启子事件循环
loop.exec();
//将读取到的信息写入文件
sourceCode=reply->readAll();
QFile file(FILE_NAME);
file.open(QIODevice::WriteOnly);
QTextStream out(&file);
out<<sourceCode<<endl;
if(file.size()>10){
QMessageBox::information(this,tr("提示"),tr("网站数据获取成功!"),QMessageBox::Ok);
hasSourceFile=true;
}
else{
QMessageBox::information(this,tr("提示"),tr("网站数据获取失败!"),QMessageBox::Ok);
hasSourceFile=false;
}
file.close();
if(file.size()<10){
file.remove();
}
}
下面就得到了txt文件(这文件就是网站浏览器读取到的源码)
接下来用正则表达式去空格:
QString divisionSource=sourceCode;
if(!urlLack.isEmpty()&&!titleLack.isEmpty()){
divisionSource.remove(QRegExp("\\s"));
关于如何寻址指定字符串,本程序提供了2个方法,一个是把QString转成char型,进行查找,代码如下:
int urlNumtemp=0; //为了添加webURLAndTitle[128][2]这个
for(int i=0;i<strlen(divisionSourceCodeChar);i++){
if(divisionSourceCodeChar[i]==divisionURL[0]){
for(int k=1;k<strlen(divisionURL);k++){
if(divisionSourceCodeChar[i+k] != divisionURL[k]){
break;
}
if(strlen(divisionURL)-1==k){
QString temp="";
for(int a=1;a<=8;a++){
QChar c=divisionSourceCodeChar[i+k+a];
temp=temp.append(c);
}
//qDebug()<<temp;
if(!temp.isEmpty()){
webURLAndTitle[urlNumtemp][0]=ui->id_URL_division_lineEdit->text()+temp;
qDebug()<<webURLAndTitle[urlNumtemp][0];
urlNumtemp++;
}
}
}
}
}
第二个是用QString里面的mid函数(估计效率很低)进行查找:
//下面是提取置顶title
int urlNum=0; //为了添加webURLAndTitle[128][2]这个
for(int i=0;i<divisionSource.length();i++){
if(divisionSource.mid(i,1)==topTitleLack.mid(0,1)){
for(int k=1;k<topTitleLack.length();k++){
if(divisionSource.mid(i+k,1) != topTitleLack.mid(k,1)){
break;
}
if(topTitleLack.length()-1==k){
QString temp="";
int a=1;
while(divisionSource.mid(i+k+a,1)!="<"){
temp=temp.append(divisionSource.mid(i+k+a,1));
a++;
}
QString temp_append="置顶:";
temp_append=temp_append.append(temp);
webURLAndTitle[urlNum][1]=temp_append;
qDebug()<<webURLAndTitle[urlNum][1];
urlNum++;
}
}
}
}
//下面是提取title
for(int i=0;i<divisionSource.length();i++){
if(divisionSource.mid(i,1)==titleLack.mid(0,1)){
for(int k=1;k<titleLack.length();k++){
if(divisionSource.mid(i+k,1) != titleLack.mid(k,1)){
break;
}
if(titleLack.length()-1==k){
QString temp="";
int a=1;
while(divisionSource.mid(i+k+a,1)!="<"){
temp=temp.append(divisionSource.mid(i+k+a,1));
a++;
}
if(!temp.isEmpty()){
webURLAndTitle[urlNum][1]=temp;
qDebug()<<webURLAndTitle[urlNum][1];
urlNum++;
}
}
}
}
}
webNum=urlNum;
saveURLandTilte();
最后是保存为CSV文件
void Widget::saveURLandTilte()
{
QFile file("URL&Title.csv");
file.open(QIODevice::WriteOnly);
QTextStream out(&file);
for(int i=0;i<webNum;i++){
out<<webURLAndTitle[i][0]+";"+webURLAndTitle[i][1]<<endl;
}
}
感谢大家阅读。
注意:
本人没有看过爬虫相关的书籍,第一次写这种程序,这个程序是半屌子的,原理很简单,没有学习过爬虫的朋友,也可以写。
程序思路如下:
1.下载要爬网站的页面。
2.用正则表达式去掉空格,使得程序处理得快。
3.因为CSDN博客文章前面的链接都一样,所以我们只要提取尾部文章编号。
(如:http://blog.csdn.net/qq78442761/article/details/xxxxxxxx)
4.扫描整个文件,得到文章标题。
5.保存为csv格式文件
源码下载如下链接:(还在审核,不知道能不能下载)
http://download.csdn.net/download/qq78442761/10245494
关于界面,在此不再说明。
来说下下载网页(此处只有伪代码,源码请从上面的链接下载):
void Widget::on_id_getWebCode_pushButton_clicked()
{
const QString URLSTR=ui->id_url_lineEdit->text();
const QString FILE_NAME=ui->id_SaveFileName_lineEdit->text();
QUrl url(URLSTR);
QEventLoop loop;
QNetworkAccessManager manager;
//发出请求
QNetworkReply *reply=manager.get(QNetworkRequest(url));
//请求结束并下载完成后,退出子事件循环
connect(reply,SIGNAL(finished()),&loop,SLOT(quit()),Qt::UniqueConnection);
//开启子事件循环
loop.exec();
//将读取到的信息写入文件
sourceCode=reply->readAll();
QFile file(FILE_NAME);
file.open(QIODevice::WriteOnly);
QTextStream out(&file);
out<<sourceCode<<endl;
if(file.size()>10){
QMessageBox::information(this,tr("提示"),tr("网站数据获取成功!"),QMessageBox::Ok);
hasSourceFile=true;
}
else{
QMessageBox::information(this,tr("提示"),tr("网站数据获取失败!"),QMessageBox::Ok);
hasSourceFile=false;
}
file.close();
if(file.size()<10){
file.remove();
}
}
下面就得到了txt文件(这文件就是网站浏览器读取到的源码)
接下来用正则表达式去空格:
QString divisionSource=sourceCode;
if(!urlLack.isEmpty()&&!titleLack.isEmpty()){
divisionSource.remove(QRegExp("\\s"));
关于如何寻址指定字符串,本程序提供了2个方法,一个是把QString转成char型,进行查找,代码如下:
int urlNumtemp=0; //为了添加webURLAndTitle[128][2]这个
for(int i=0;i<strlen(divisionSourceCodeChar);i++){
if(divisionSourceCodeChar[i]==divisionURL[0]){
for(int k=1;k<strlen(divisionURL);k++){
if(divisionSourceCodeChar[i+k] != divisionURL[k]){
break;
}
if(strlen(divisionURL)-1==k){
QString temp="";
for(int a=1;a<=8;a++){
QChar c=divisionSourceCodeChar[i+k+a];
temp=temp.append(c);
}
//qDebug()<<temp;
if(!temp.isEmpty()){
webURLAndTitle[urlNumtemp][0]=ui->id_URL_division_lineEdit->text()+temp;
qDebug()<<webURLAndTitle[urlNumtemp][0];
urlNumtemp++;
}
}
}
}
}
第二个是用QString里面的mid函数(估计效率很低)进行查找:
//下面是提取置顶title
int urlNum=0; //为了添加webURLAndTitle[128][2]这个
for(int i=0;i<divisionSource.length();i++){
if(divisionSource.mid(i,1)==topTitleLack.mid(0,1)){
for(int k=1;k<topTitleLack.length();k++){
if(divisionSource.mid(i+k,1) != topTitleLack.mid(k,1)){
break;
}
if(topTitleLack.length()-1==k){
QString temp="";
int a=1;
while(divisionSource.mid(i+k+a,1)!="<"){
temp=temp.append(divisionSource.mid(i+k+a,1));
a++;
}
QString temp_append="置顶:";
temp_append=temp_append.append(temp);
webURLAndTitle[urlNum][1]=temp_append;
qDebug()<<webURLAndTitle[urlNum][1];
urlNum++;
}
}
}
}
//下面是提取title
for(int i=0;i<divisionSource.length();i++){
if(divisionSource.mid(i,1)==titleLack.mid(0,1)){
for(int k=1;k<titleLack.length();k++){
if(divisionSource.mid(i+k,1) != titleLack.mid(k,1)){
break;
}
if(titleLack.length()-1==k){
QString temp="";
int a=1;
while(divisionSource.mid(i+k+a,1)!="<"){
temp=temp.append(divisionSource.mid(i+k+a,1));
a++;
}
if(!temp.isEmpty()){
webURLAndTitle[urlNum][1]=temp;
qDebug()<<webURLAndTitle[urlNum][1];
urlNum++;
}
}
}
}
}
webNum=urlNum;
saveURLandTilte();
最后是保存为CSV文件
void Widget::saveURLandTilte()
{
QFile file("URL&Title.csv");
file.open(QIODevice::WriteOnly);
QTextStream out(&file);
for(int i=0;i<webNum;i++){
out<<webURLAndTitle[i][0]+";"+webURLAndTitle[i][1]<<endl;
}
}
感谢大家阅读。
相关文章推荐
- 实现app上对csdn的文章列表上拉刷新下拉加载以及加入缓存文章列表的功能 (制作csdn app 四)
- CSDN的博客搜索功能太弱,教你怎么搜索自己博客的文章
- qt实现头像上传功能(写了4个类,朝十晚八的博客,非常好)
- 用flask开发个人博客(37)—— 使用Flask-pagedown实现博客文章预览的功能
- Hello Python!用python写一个抓取CSDN博客文章的简单爬虫
- Python实现抓取CSDN博客首页文章列表
- php实现的简单的csdn博客文章抓取
- C#实现越过CSDN博客中不能使用CSS的style标签功能
- python实现博客文章爬虫示例
- 实现app上对csdn的文章列表上拉刷新下拉加载以及加入缓存文章列表的功能 (制作csdn app 四)
- C++中字母大小写转换实现的优化 - 程序即人生 - 博客频道 - CSDN.NET
- 实现QQ窗体的缩入伸出功能(文章来自csdn) 选择自 lovecdw 的 Blog
- [js高手之路]Node.js实现简易的爬虫-抓取博客所有文章列表信息
- 在Web微信应用中使用博客园RSS以及Quartz.NET实现博客文章内容的定期推送功能
- 杂谈:csdn 博客有没有随意将文章加入自定义分类的功能?
- python爬虫之python2.7.8抓取csdn博客文章
- 实现app上对csdn的文章列表上拉刷新下拉加载以及加入缓存文章列表的功能 (制作csdn app 四)
- 吐槽:CSDN的博客文章编辑功能弱爆了
- 我的第一篇CSDN博客文章,Python代码实现矩阵翻转
- Python实现抓取CSDN博客首页文章列表