简单的爬虫 一

前两天看到院子子里有人用Python写了一个爬虫,爬拉勾网统计薪资等数据,所以我就想我是不是用C#也来一个爬虫

首先分析拉勾网

先选择一个.NET的,地点先统一选择北京

然后进入下面的这个页面

http://www.lagou.com/zhaopin/.NET/?labelWords=label

然后当我使劲刷新 上面这个地址的时候我发现,页面的头先出来的,中间的列表慢了一下,所以我猜测,当这个页面执行完成后通过AJAX加载第一页的信息。

然后我通过 fiddler 抓包验证我的猜想。

刷新一些这个页面抓到80个左右的包

其中第一个包返回的html基本没有什么用,起码暂时没有我想要的信息。

在这个包中,找到了我需要的信息,他返回的是一个JSON格式的数据。

{
    "resubmitToken": null,
    "code": 0,
    "success": true,
    "requestId": null,
    "msg": null,
    "content": {
        "totalCount": 1007,
        "pageNo": 1,
        "pageSize": 15,
        "hasNextPage": true,
        "totalPageCount": 68,
        "currentPageNo": 1,
        "hasPreviousPage": false,
        "result": [
            {
                "relScore": 965,
                "createTime": "2016-04-28 10:05:39",
                "companyId": 28818,
                "calcScore": false,
                "showOrder": 0,
                "haveDeliver": false,
                "positionName": ".NET/C#",
                "positionType": "后端开发",
                "workYear": "3-5年",
                "education": "本科",
                "jobNature": "全职",
                "companyShortName": "畅捷通信息技术股份有限公司",
                "city": "北京",
                "salary": "15k-25k",
                "financeStage": "上市公司",
                "positionId": 1765871,
                "companyLogo": "image1/M00/00/3F/CgYXBlTUXMOADN_rAADQYzTeBQE385.jpg",
                "positionFirstType": "技术",
                "companyName": "畅捷通",
                "positionAdvantage": "上市公司 免费班车 20-35W 春节14天假",
                "industryField": "移动互联网 · 企业服务",
                "companyLabelList": [
                    "技能培训",
                    "节日礼物",
                    "绩效奖金",
                    "岗位晋升"
                ],
                "score": 1323,
                "deliverCount": 7,
                "leaderName": "曾志勇",
                "companySize": "500-2000人",
                "countAdjusted": false,
                "adjustScore": 48,
                "randomScore": 0,
                "orderBy": 99,
                "adWord": 1,
                "formatCreateTime": "2016-04-28",
                "imstate": "disabled",
                "createTimeSort": 1461809139000,
                "positonTypesMap": null,
                "hrScore": 53,
                "flowScore": 158,
                "showCount": 722,
                "pvScore": 12.26185956183834,
                "plus": "是",
                "searchScore": 0,
                "totalCount": 0
            },
        ],
        "start": 0
    }
}

反序列化后并且干掉一部分多余的数据,得到上面的这个串

JSON串和页面上展示的信息一对,证明了我的猜想是对的。

剩下的就是想办法获取到,每一条招聘信息的URL地址

如何获取到从第一页到最后一页的JSON数据

首先根据返回回来的JSON创建一个对应的实体,用来存放数据。

分析招聘信息的URL

http://www.lagou.com/jobs/1765871.html
http://www.lagou.com/jobs/1613765.html
http://www.lagou.com/jobs/797212.html
http://www.lagou.com/jobs/224215.html
http://www.lagou.com/jobs/1638545.html

从上面的这五个URL地址可以发现,URL地址的结构

http://www.lagou.com/jobs/+?+.html

而这个 ? 可要到JSON串中找一下

很轻松的就在JSON中找到了这个? 为  "positionId": 1765871,

现在还剩下如何从第一页,抓取到最后一页

查看一下请求报文

报文中 

Query String
  city:北京
Form Data
  first:false
  pn:1
  kd:.NET

其中   

  city 是搜索的城市

  first是用来表示是否是第一次加载第一页

  pn 表示第几页

  kd 表示搜索的技术

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;

namespace LG
{
    public static class RequestDemo
    {
        public static DTOModel RequestDTO(
            string kd = ".NET",
            string city = "北京",
            bool first = false,
            int pn = 1
            )
        {
            string URL = "http://www.lagou.com/jobs/positionAjax.json?city=" + city;
            DTOModel dto = new DTOModel();
            StringBuilder result = new StringBuilder();
            HttpWebRequest req = null;
            HttpWebResponse res = null;
            Stream receiveStream = null;
            StreamReader sr = null;

            req = WebRequest.Create(URL) as HttpWebRequest;
            req.Method = "POST";
            req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36";
            req.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
            req.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8");
            req.Headers.Add("Origin", "http://www.lagou.com");
            req.Headers.Add("X-Requested-With", "XMLHttpRequest");
            req.Host = "www.lagou.com";
            req.Referer = "http://www.lagou.com/zhaopin/" + kd + "/?labelWords=label";
            System.IO.Stream RequestStream = req.GetRequestStream();
            string sb = "";
            sb += "first" + first;
            sb += "&pn" + pn;
            sb += "&kd" + kd;
            byte[] buf;
            buf = System.Text.Encoding.GetEncoding("utf-8")
                        .GetBytes(sb);

            res = req.GetResponse() as HttpWebResponse;
            receiveStream = res.GetResponseStream();

            Encoding encode = Encoding.GetEncoding("UTF-8");
            sr = new StreamReader(receiveStream, encode);
            char[] readbuffer = new char[256];
            int n = sr.Read(readbuffer, 0, 256);
            while (n > 0)
            {
                string str = new string(readbuffer, 0, n);
                result.Append(str);
                n = sr.Read(readbuffer, 0, 256);
            }
            receiveStream.Close();
            sr.Close();
            JavaScriptSerializer js = new JavaScriptSerializer();
            dto = js.Deserialize<DTOModel>(result.ToString());

            return dto;

        }
    }
}

然后根据返回的数据构建对应的URL

    "content": {
        "totalCount": 5000,
        "hasNextPage": true,
        "pageNo": 1,
        "pageSize": 15,
        "totalPageCount": 334,
        "currentPageNo": 1,
        "hasPreviousPage": false,

根据这些参数我们可以循环去获取数据。

拿着构建好的URL地址,我们就可以去找我们想要的页面了。

时间: 2024-09-30 07:56:35

简单的爬虫 一的相关文章

Python---BeautifulSoup 简单的爬虫实例

对python自动化比较熟的同学,很多都懂一些爬虫方法,有些还研究的很深,下面呢我介 绍一个简单的爬虫实例,供大家参考.当然里面有很多需求是可以再学习的,下载进度的显 示.下载完成的提示等等. 一.首先我们要研究爬虫网站的架构,我这里已ring.itools.cn为例,我需要爬的是铃声. 大家可以自己去分析,这个网站的架构比较简单就不讲了. 我们最终要获取的是下面两个信息: 二.我们写下面的脚本来获取 上面的脚本呢,获取到songname和playaddr都是一组数据,即都是列表,我们需要把 他

Web Spider实战1——简单的爬虫实战(爬取&quot;豆瓣读书评分9分以上榜单&quot;)

1.Web Spider简介 Web Spider,又称为网络爬虫,是一种自动抓取互联网网页信息的机器人.它们被广泛用于互联网搜索引擎或其他类似网站,以获取或更新这些网站的内容和检索方式.它们可以自动采集所有其能够访问到的页面内容,以供搜索引擎做进一步处理(分检整理下载的页面),而使得用户能更快的检索到他们需要的信息. 2.一个简单的网络爬虫案例 作者在浏览网页的时候看到豆瓣书单的网页(首页),如下所示: 因为书单共有409本书,17个页面,若是要一个个浏览完,需要较长的时间,想要保存好书单,那

用python3.x与mysql数据库构建简单的爬虫系统(转)

这是在博客园的第一篇文章,由于本人还是一个编程菜鸟,也写不出那些高大上的牛逼文章,这篇文章就是对自己这段时间学习python的一个总结吧. 众所周知python是一门对初学编程的人相当友好的编程语言,就像本屌丝一样,一学就对它产生好感了!当然,想要精通它还有很多东西需要学习.那废话不多说了,下面我就来说一下如何用python3.x与mysql数据库构建一个简单的爬虫系统(其实就是把从网页上爬下来的内容存储到mysql数据库中). 首先就是搭建环境了,这里就简介绍一下我的环境吧.本机的操作系统是w

python 一个简单的爬虫(1)

1.一个简单的爬虫:爬取豆瓣的热门电影的信息 技能:获取网页源码,正则表达式,函数调用,全局变量的定义 1 #! /usr/bin/env python 2 # -*- coding=utf-8 -*- 3 import requests 4 import json 5 import re 6 import sys 7 reload(sys) 8 sys.setdefaultencoding("utf-8") 9 classinfo = [] 10 f = open('info.txt

nodejs实现简单的爬虫

闲着无聊就想鼓捣点东西玩玩,所以决定用node做个爬虫来爬点数据.查了些资料鼓捣了一段时间也算是弄出了个简单的爬虫. 目前这只小爬虫还是有不少缺陷,不过爬点简单的静态页面上的内容已经足够了. 详细的使用说明我就不介绍了,在github中有.地址:https://github.com/XLandMine/node-crawler 相关代码的说明我也都有注释,需要注意的是我对于爬取深度的理解是url的path有几个‘/’即为几层深度,默认为5. 主要的实现步奏就是利用http或者https模块发送r

一个简单网络爬虫示例(转载)

在学生时期,可能听到网络爬虫这个词会觉得很高大上,但是它的简单实现可能学生都不难懂. 网络爬虫应用,就是把整个互联网真的就当做一张网,像蜘蛛网那样,应用就像一个虫子,在网上面按照一定的规则爬动. 现在互联网应用最广的就是http(s)协议了,本文例子就是基于使用http(s)协议的,只作为示例,不涉及复杂的算法(实际上是最重要的). 设计思路: 程序入口从一个或多个url开始,通过http(s)获取url的内容,对获取到内容处理,获取内容中需要爬取的信息,获取到内容中的url链接,再重复以上步骤

纯手工打造简单分布式爬虫(Python)

前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. 本章讲的依旧是实战项目,实战内容是打造分布式爬虫,这对初学者来说,是一个不小的挑战,也是一次有意义的尝试.这次打造的分布式爬虫采用比较简单的主从模式,完全手工打造,不使用成熟框架,基本上涵盖了前六章的主要知识点,其中涉及分布式的知识点是分布式进程和进程间通信的内容,算是对Python爬虫基础篇的总结. 现在

【转】使用webmagic搭建一个简单的爬虫

[转]使用webmagic搭建一个简单的爬虫 刚刚接触爬虫,听说webmagic很不错,于是就了解了一下. webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫. 这句话说的真的一点都不假,像我这样什么都不懂的人直接下载部署,看了看可以调用的方法,马上就写出了第一个爬虫小程序. 以下是我学习的过程: 首先需要下载jar:http://webmagic.io/download.html 部署好后就建一个class继承PageProcesso

视频博文结合的教程:用nodejs实现简单的爬虫

先来段求分小视频: https://www.iesdouyin.com/share/video/6550631947750608142/?region=CN&mid=6550632036246555405&titleType=title&timestamp=1525407578&utm_campaign=client_share&app=aweme&utm_medium=ios&iid=30176260384&utm_source=qq&am

python 最简单的爬虫

一个简单的爬虫工程 环境: OS:Window10 python:3.7 安装一些库文件 pip install requests pip install beautifulsoup4 pip install lxml 在安装的时候如果遇到了你的pip版本过低的错误的话,可以找到你本地的C:\Users\XXX\PycharmProjects\getHtml\venv\Lib\site-packages下面的pip-18.1.dist-info文件夹删除,之后在进行更新 下面是提取一个网页的图片