基于招聘站点和企业名称的 email采集

image

实习期间,公司安排了一个简单的任务,下面是任务要求:

任务要求:

基于招聘站点和企业名称的 email采集

1. 获取一批要采集email的企业
2. 使用百度,在各大招聘站点内部搜索要采集的企业的招聘页面。
3. 从招聘页面提取出企业的email(需要排除招聘站点官方、猎头相关的email)。
4. 将采集的结果保存到数据库

看一下需要采集的企业

image

爬取下来的结果图:

理一下大概的思路

基本思路:

  1. 初始url分几钟:智联,猎聘,大街,前程无忧,中华英才网 这些都是需要进行单个站点的解析分别编写代码
  2. 连接数据库提取企业名称,插入url,进行get请求
    • get_url_html 请求模块
  3. 解析各个站点获取信息
    • 如何判断??存在网页信息不对称
  4. 信息进行正则匹配,匹配email
    • get_emails 模块
  5. 存到数据库
image

爬虫流程:

  1. 检查是否有api

  2. 切入源头

    百度内部搜索:在百度上输入

     site:站点域名+搜索的信息
    

    eg:

    百度内部搜索多个站点
    https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=93153557_hao_pg&wd=site%EF%BC%9A51job.com%20%E9%98%BF%E9%87%8C

  3. 爬取的范围

    爬取的是需要采集的企业的email

  4. 多层网络结构间跳转流程

[图片上传失败...(image-7a1227-1539165929069)]

  1. 选择需要连接的数据库和表

    连接的表et_ema的DDL信息:

     CREATE TABLE `et_ema` (
       `id` int(12) NOT NULL AUTO_INCREMENT COMMENT 'ID',
       `etid` int(11) NOT NULL COMMENT '序号',
       `email` varchar(50) NOT NULL DEFAULT '' COMMENT '公司email',
       PRIMARY KEY (`id`),
       UNIQUE KEY `etid,email` (`etid`,`email`)
     ) ENGINE=InnoDB AUTO_INCREMENT=1776 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC COMMENT='公司email'
    
  2. 确定爬取的字段和连接关系

    公司

    email

数据采集

  • 常用模块

    request

  • 解析工具

    xpath

  • 数据存储

    mysql

  • 爬虫效率提升问题

    简单使用多协程

代码大纲:

main函数:

1. 连接数据库
    输入:无
    输出:conn,cursor
2. 获取公司信息:etid,etname
    输入:cursor
    输出:companys
3. 站点代码:获取网页信息,1,2,3
    输入:url
    输出:text
4. 正则email,并去重
    输入:text
    输出:emails
5. 存入数据库:一次存入一条信息
    输入:conn, companys_email, table_name
    输出:无
6. 关闭数据库
    输入:conn,cursor
    输出:无
image

遇到的问题:

正则匹配的问题

1. 不匹配括号里的内容的方法:使用 ?:
2. [...]可以匹配【】中的任意字符,如[abc]即匹配a,b,c的任意一个字符
3. findall匹配后不能使用group

字典和文件格式转换:

1.json.dumps    将 Python 对象编码成 JSON 字符串
2.json.loads    将已编码的 JSON 字符串解码为 Python 对象
3. 读取txt文件里的字典(打开,read,load,关闭)
    file = open('text.txt', 'r')
    js = file.read()
    dic = json.loads(js)
    print (dic)
    file.close()
4. 字典写入txt:
    dic = {  
        'andy':{  
            'age': 23,  
            'city': 'beijing',  
            'skill': 'python'  
        },  
        'william': {  
            'age': 25,  
            'city': 'shanghai',  
            'skill': 'js'  
        }  
    }  
    
    js = json.dumps(dic)   
    file = open('test.txt', 'w')  
    file.write(js)  
    file.close()  

screen的用法:

screen:可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换,可以后台运行爬虫
后台运行爬虫的步骤:
1. 直接运行爬虫
    screen python run.py
2. 退出保存窗口
    ctrl+a+d 
3. 查看打开的screen(意思的‘屏幕’)
    screen -ls
4. 重新打开关闭的screen
    screen -r 50126

xpath匹配问题:

一属性多值:[contains(@class, "li")]

对于如何将edid对应:

获取的时候同时将etid和etname从数据库中拿出来,之后存储的时候再一起存进去

如何去除list中重复的元素:

使用内置的set函数:
    i = ['b','c','d','b','c','a','a']
    z = list(set(i))
    print z

在数据库中建立表:

CREATE TABLE IF NOT EXISTS `et_email` (
    `id` INT(12) NOT NULL AUTO_INCREMENT COMMENT 'ID',
    `etid` INT(11) NOT NULL COMMENT '序号',
    `email` VARCHAR(30) NOT NULL DEFAULT '' COMMENT '公司email',
    PRIMARY KEY (`id`),`et_email`
    KEY (`etid`)
) ENGINE=INNODB DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC COMMENT='公司email'

replace into et_email(etid,email) values('100224953','emma.chn@unilever.com')
replace into et_email(etid,email) values('2817270','u81f3hr_sytate@163.com')

多协程的问题:

gevent.pool不能进行多参数的传递,可以使用from functools import partial来进行多参数的传递
使用方法:  
    def run (a,b):
        pass
    partial.work = partial(run, a)
    gevent.pool.map(partial.work,b)
(注意:
partial不能有迭代的参数
map函数是需要是以迭代的方式来对b进行数据的提取,以后以参数的形式调用
如果有多个需要迭代的参数,可以使用z = zip(a,b))
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,919评论 2 89
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,944评论 6 13
  • 爬虫的基本流程 一、发送HTTP请求(Request)通过Python库向目标站点发送HTTP请求,等待服务器响应...
    晓枫_0544阅读 772评论 0 0
  • 广东冬天一如既往的暖煦。没有太多的落叶,更没有干枯的树干。风是轻轻的,树是郁葱的,人是愉悦的。
    hyhyy阅读 151评论 0 0
  • 你要接受这世上突如其来的失去。洒了的牛奶,丢了的钱包,走散的爱人,断掉的友情。你唯一能做的,就是努力让自己过好一点...
    笃学青衿阅读 224评论 1 1