C#写爬虫,版本V2.0

这个版本主要是以百度图片为对象,对其进行爬虫操作,实现了最基本的下载功能,但是缺陷非常多,日后还会对其进行改进。

打开百度图片,同时打开开发者工具,我们会发现,百度图片是通过如下的一段ajax来加载图片的。

http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1466428638972_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%94%90%E5%AB%A3&f=3&oq=tangyan&rsp=0

这里,我们只需了解word后面就是我们的关键字,那么,这个就比较好弄了,结合一部分V1.0的代码,很快就可以开发出来,原理和V1.0类似。

后台代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Text.RegularExpressions;

namespace 针对百度图片的动态网页爬虫
{
    public partial class Form1 : Form
    {
        static int count = 0;
        public Form1()
        {
            InitializeComponent();
        }

        private void btnDo_Click(object sender, EventArgs e)
        {
            int pageCount=2;
            string keyword = this.keyWords.Text;
            for (int i = 0; i <pageCount; i++)
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1466307565574_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word="+keyword.ToString());
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    if (response.StatusCode == HttpStatusCode.OK)
                    {
                        using (Stream stream = response.GetResponseStream())
                        {
                            try
                            {
                                // 下载指定页的所有图片
                                DownloadPage(stream);
                            }
                            catch (Exception ex)
                            {
                                // 跨线程访问UI线程的txtLogs

                            }
                        }
                    }
                    else
                    {
                       // MessageBox.Show("获取第" + pageCount + "页失败:" + response.StatusCode);
                    }
                }
            }
            MessageBox.Show("执行成功,共"+count.ToString()+"图片");
        }
        private static string[] getLinks(string html)
        {
            const string pattern = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";
            Regex r = new Regex(pattern, RegexOptions.IgnoreCase); //新建正则模式
            MatchCollection m = r.Matches(html); //获得匹配结果
            string[] links = new string[m.Count];
            int count=0;
            for (int i = 0; i < m.Count; i++)
            {
                if(isValiable(m[i].ToString()))
                {
                      links[count] = m[i].ToString(); //提取出结果
                    count++;
                }

            }
            return links;
        }
        private void DownloadPage(Stream stream)
        {
            using(StreamReader reader=new StreamReader(stream))
            {
                string r1;
                StringBuilder sb = new StringBuilder();
                while((r1=reader.ReadLine())!=null)
                {
                    sb.Append(r1);
                }
                FileStream aFile = new FileStream("../../txt.txt", FileMode.OpenOrCreate);
                StreamWriter sw = new StreamWriter(aFile);//将网页存储到了txt文本文件中
                sw.WriteLine(sb.ToString());
                sw.Close();
                string[] s;
                s = getLinks(sb.ToString());
                int i = 0;

                for(i=0;i<s.Count();i++)
                {
                    if(s[i]!=null||s[i]!="")
                    {
                        count++;
                        savePicture(s[i]);
                    }

                }
                this.label2.Text = count.ToString();
            }
        }
        private static bool isValiable(string url)
        {
            if (url.Contains(".jpg") || url.Contains(".gif") || url.Contains(".png"))
            {
                return true; //得到一些图片之类的资源
            }
            return false;
        }
        private static void savePicture(string path)
        {
            DataClasses1DataContext db = new DataClasses1DataContext();
            Uri url = new Uri(path);
            HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(url);
            webRequest.Referer = "http://image.baidu.com";
            HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

            if (isValiable(path))//判断如果是图片,就将其存储到数据库中。
            {
                Bitmap myImage = new Bitmap(webResponse.GetResponseStream());

                MemoryStream ms = new MemoryStream();
                myImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                var p = new pictureUrl
                {
                    pictureUrl1 = ms.ToArray()
                };
                db.pictureUrl.InsertOnSubmit(p);
                db.SubmitChanges();
            }

        }
    }
}

演示效果:

这个程序只是解决了有无得问题,还有许多问题,以后会继续解决。

时间: 2024-10-04 03:33:31

C#写爬虫,版本V2.0的相关文章

python写一个通讯录V2.0

python写一个通讯录step by step V2.0 引用知识 list + dict用于临时存储用户数据信息 cPickle用于格式化文件存取 依旧使用file来进行文件的存储 解决问题 1.操刀开始去做 原始代码 实现功能(可做模板) 1.判断输入内容是否在给出的menu目录内,在的话,返回对应结果,不在就报错 2.调用os模块的exit功能 3.字典配合循环加上函数实现switch的功能 #!/usr/bin/env python #coding:utf8 #Author:zhuim

co-dialog弹出框组件-版本v2.0.1

具体案例查看co-dialog:https://koringz.github.io/co-dialog/index.html 2.0.1版本优化项,代码压缩,修复PC和移动端自适应,修复显示弹出框浏览器边框隐藏对body产生内容错位,添加 onResize 默认为 true, 添加选项 type 不同类型显示弹出框 ['success', 'error', 'warning', 'info', 'question']. 压缩内容的实现方式,主要是通过重构了内部代码,整理静态方法,抽离被多次调用的

[python]糗百热点爬虫v2.0【15/4/21更新】

刚刚测试了糗百爬虫,结果第二天糗百的源代码就换格式了= = 改了下正则表达式,但是内容中存在的html转码还未匹配,不影响使用 #! -*- coding:utf-8 -*- #! usr/bin/python ''' #===================================================== # FileName: Spider_qb.py # Describe: 从糗百下载段子并依次播放 # Modifier: sunny # Since: 2015-04-

(转)新手写爬虫v2.5(使用代理的异步爬虫)

开始 开篇:爬代理ip v2.0(未完待续),实现了获取代理ips,并把这些代理持久化(存在本地).同时使用的是tornado的HTTPClient的库爬取内容. 中篇:开篇主要是获取代理ip:中篇打算使用代理ip,同时优化代码,并且异步爬取内容.所以接下来,就是写一个:异步,使用代理的爬虫.定义为:爬虫 v2.5 为什么使用代理 在开篇中我们爬来的代理ip怎么用? 在需要发送请求的时候,需要把请求,先发送到代理服务器(通过代理ip和端口),再由代理服务器请求目标网站.目标网站返回响应的时候也是

JuCheap V2.0响应式后台管理系统模板正式发布beta版本

JuCheap V1.* 查看地址: http://blog.csdn.net/allenwdj/article/details/49155339 经过半年的努力,JuCheap后台通用响应式管理后台模板框架,终于有V1.*正式升级到了JuCheap V2.0 beta版本. 首先介绍下JuCheap V2.0的基础技术: 1.相对于V1.*版本的框架,更加的简洁 2.T4模板,一键生成多种类型的文件 3.DI容器,由MEF改成了AutoFac,可选属性注入和构造函数注入两种方式. 4.真正的响

[Python]新手写爬虫全过程(转)

今天早上起来,第一件事情就是理一理今天该做的事情,瞬间get到任务,写一个只用python字符串内建函数的爬虫,定义为v1.0,开发中的版本号定义为v0.x.数据存放?这个是一个练手的玩具,就写在txt文本里吧.其实主要的不是学习爬虫,而是依照这个需求锻炼下自己的编程能力,最重要的是要有一个清晰的思路(我在以这个目标努力着).ok,主旨已经订好了,开始‘撸串’了. 目标网站:http://bohaishibei.com/post/category/main/(一个很有趣的网站,一段话配一个图,老

heatmap.js v1.0 到 v2.0,详细总结一下:)

前段时间,项目要开发热力图插件,研究了heatmap.js,打算好好总结一下. 本文主要有以下几部分内容: 部分源码理解 如何迁移到v2.0 v2.0官方文档译文 关于heatmap.js介绍,请看这里: http://www.oschina.net/p/heatmap-js 目前,对于热力图的开发,百度.高德开发平台上使用的都是这款JS开源库.当然,现在还有我们公司:P 百度示例:http://developer.baidu.com/map/jsdemo.htm#c1_15 高德示例:http

用go写爬虫服务并发请求,限制并发数

java写爬虫服务,思路是线程池,任务队列,限制并行线程数即可. go要用另一种设计思路,不能在线程层面限制,协程的异步请求,如果不作处理,并行发出所有网络请求,因网络请求数过多,会抛出异常 低版本的go可以并行执行map的操作,高版本会报异常,需要把map改为array,改起来很简单 func updateAllShowTimePeople() { //得到要请求的url,多批次请求 allurls := getShowTimeTypeIndexFromDB() //要请求的任务总数 allu

当前标识(IIS APPPOOL\dfcreport)没有对“C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files”的写访问权限。

Asp.NET网站部署到IIS上面,浏览出现如下图所示错误. 原因原因最APPPOOL\dfcreport)没有对“C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temp" style="border-left-width: 0px; max-width: 100%; border-right-width: 0px; width: 1056px; border-bottom-width: 0px; padding-bottom: 0px