使用多线程爬取招聘网站

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 使用多线程获取某招聘网站的信息,使用环境py3,话不多说直接上代码

使用多线程获取某招聘网站的信息,使用环境py3,话不多说直接上代码

该导的包你可就不能少了

import threading
import requests
from pyquery import PyQuery as pq
import json
from pymongo import MongoClient
from fake_useragent import UserAgent
import time
from config import *

我这里用到的是Mongodb储存的,fake_useragent是一个‘User-Agent’一个共享库,看着用,我这边写的是一个配置文件,大家可以看将**文件写自己的文件。

client = MongoClient(().mogodb()["IP"],().mogodb()["port"])
u = UserAgent()

class data():

def __init__(self,startpage,page,citynum,hangyenum):
    self.startpage=startpage
    self.page=page
    self.citynum=citynum
    self.hangyenum=hangyenum
def datature(self):
    if self.startpage==0:
        self.startpage=1
    for i in range(self.startpage,self.page):
        try:
            headers = {
                'User-Agent': u.random,
            }
            yu = requests.get('这里是一个代理url').text
            ip = yu.split(':')[0]
            port = yu.split(':')[1]
            proxy_http = "http://{0}:{1}".format(ip, port)
            proxy_dict = {"http": proxy_http}
            print(proxy_dict)
            url='https://fe-api.zhaopin.com/c/i/sou?start={0}&pageSize=60&cityId={1}&industry={2}&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kt=3&_v=0.64455588&x-zp-page-request-id=2fb2f4e53284471aa21894bf291db027-1543801568582-396367'.format(str(i*60),self.citynum,self.hangyenum)
            print(self.startpage,self.page)
            r=requests.get(url,headers=headers,proxies=proxy_dict)
            dict1=json.loads(r.text)
            for j in dict1['data']['results']:
                href='https://jobs.zhaopin.com/'+j['number']+'.htm'
                href=j['positionURL']
                print(href)
                r1 = requests.get(href, headers=headers,proxies=proxy_dict)
                doc = pq(r1.text)
                title = doc('.new-info h1.l.info-h3').text()
                xinzhi = doc('.new-info div.l.info-money strong').text()
                company = doc('li.clearfix div.company.l a').text()
                jianjie = doc('li.clearfix div.info-three.l').text()
                zhiweixinxi = doc('div.l.pos-info-in div.pos-info-tit p.r ').text()
                zhiweimiaoshu = doc('div.responsibility.pos-common div.pos-ul').text()
                gongsigaikuang = doc('div.intro-content div[align="left"]').text()
                lianxifangshi = doc('div.intro-content div[style="font-family: 宋体;"]').text()
                list1=jianjie.split(' ')
                try:
                    list2=zhiweixinxi.split(' ')[0]
                except:
                    list2=''
                try:
                    jianjie1=list1[0]
                    jianjie2=list1[1]
                    jianjie3=list1[2]
                    jianjie4=list1[3]
                except:pass
                if title!=""and len(list1)==4:
                    db = client.自己的数据库名1# 创建数据库名
                    post = {'title': title,
                            'xinzhi': xinzhi,
                            'conmpany': company,
                            'dizhi': jianjie1,
                            'jingyan':jianjie2,
                            'xueli':jianjie3,
                            'zhaopinrenshu':jianjie4,
                            'zhiweixinxi': list2,
                            'zhiweimiaoshu': zhiweimiaoshu,
                            'gongsigaikuang': gongsigaikuang,
                            'lianxifangshi': lianxifangshi,
                            'html':href
                            }
                    posts = db.zhaopin  # 创建表名
                    post_id = posts.insert_one(post).inserted_id  # 创建id将数据提交
                else:
                    pass
         print(i)
            self.startpage+=1
        except:
            print("请求次数过多或程序出错错误页:",self.startpage)
            self.startpage += 1
            self.datature()

下面是使用多线程执行上面这段请求解析
def action(a,b,c,d):

start = data(int(a),int(b),c,d)
start.datature()

if __name__=="__main__":

while True:
    print('88888888此程序启动为默认程序8888888888')
    for i in range(26):
        citynum = zhilianzhaopin().sheng(i)["citynum"]
        for j in range(12):
            hangyenum = zhilianzhaopin().hangye(j)["hangyenum"]
            print('点击查看多少页,默认程序是101页:', end='')
            print('https://sou.zhaopin.com/?jl={0}&in={1}'.format(citynum, hangyenum))
            page = zhilianzhaopin().zongyeshu(101)[1]
            time.sleep(5)
            fenyepage = int(int(page) / 10)
            duandianpage = fenyepage * 10
            if fenyepage!=0:
                for i in range(11):
                    if i <= 9:
                        t = threading.Thread(target=action, args=(i * fenyepage, (i + 1) * fenyepage,citynum,hangyenum))
                    else:
                        t = threading.Thread(target=action, args=(duandianpage, page,citynum,hangyenum))
                    t.start()
            elif fenyepage==0:
                action(1, page,citynum,hangyenum)

这下面是配置文件,可供参考:

class zhilianzhaopin():

def mogodb(self):
    a={}
    #mongodbIp
    IP=''
    #mongodb端口号
    port=
    a["IP"]=IP
    a["port"]=port
    if  a["IP"]!="" and a["port"]!="" :
        return a
    else:
        print("配置文件mongodb参数缺失")
#省会名
def sheng(self,cityxuhao):
    list1={0: '北京', 1: '上海', 2: '深圳', 3: '广州', 4: '天津', 5: '成都', 6: '杭州', 7: '武汉', 8: '大连', 9: '长春', 10: '南京', 11: '济南',
     12: '青岛', 13: '苏州', 14: '沈阳', 15: '西安', 16: '郑州', 17: '长沙', 18: '重庆', 19: '哈尔滨', 20: '无锡', 21: '宁波', 22: '福州',
     23: '厦门', 24: '石家庄', 25: '合肥', 26: '惠州'}
    a='''0: '北京', 1: '上海', 2: '深圳', 3: '广州', 4: '天津', 5: '成都', 6: '杭州', 7: '武汉', 8: '大连', 9: '长春' '''
    b=''' 10: '南京', 11: '济南',12: '青岛', 13: '苏州', 14: '沈阳', 15: '西安', 16: '郑州', 17: '长沙', 18: '重庆', '''
    c='''19: '哈尔滨', 20: '无锡', 21: '宁波', 22: '福州',23: '厦门', 24: '石家庄', 25: '合肥', 26: '惠州' '''
    # print('%s\n%s\n%s'%(a,b,c))
    # try:
    #     cityxuhao=int(input('输入序号,整数:'))
    # except:
    #     print('输入错误!!!')
    #     self.sheng()
    #城市名
    city=list1[cityxuhao]
    print(city)
    #城市编码
    dict1={}
    citynum={'北京':'530','上海':'538','深圳':'765','广州':'763','天津':'537','成都':'801','杭州':'653','武汉':'736','大连':'600','长春':'631','南京':'635','济南':'702','青岛':'703','苏州':'639','沈阳':'599','西安':'854','郑州':'719','长沙':'749','重庆':'551','哈尔滨':'622','无锡':'636','宁波':'654','福州':'681','厦门':'682','石家庄':'515','合肥':'664','惠州':'773'}
    dict1['citynum']=citynum[city]
    if dict1['citynum']!="":
        return dict1
    else:
        print("配置文件省会名参数出错")

#行业
def hangye(self,hangyexuhao):
    #参考行业
    list1={0: '互联网/IT', 1: '金融', 2: '房地产/建筑', 3: '商业服务', 4: '贸易/批发/零售', 5: '教育/艺术', 6: '服务业', 7: '文化/传媒/娱乐', 8: '制造业', 9: '物流运输', 10: '能源/环保', 11: '政府/非盈利', 12: '农林牧渔'}
    a=''' 0: '互联网/IT', 1: '金融', 2: '房地产/建筑', 3: '商业服务', 4: '贸易/批发/零售', 5: '教育/艺术', 6: '服务业', 7: '文化/传媒/娱乐', 8: '制造业', 9: '物流运输' '''
    b=''' 10: '能源/环保', 11: '政府/非盈利', 12: '农林牧渔' '''
    # print('%s\n%s'%(a,b))
    # hanyexuhao=hanyexuhao
    # try:
    #     hangyexuhao=int(input('输入对应序号:'))
    # except:
    #     print("输入错误!!!")
    #     self.hangye()
    dict1={}
    hangye = list1[hangyexuhao]
    print(hangye)
    # 行业编码
    hangyenum = {"互联网/IT": "10100", "金融": "10200", "房地产/建筑": "10800", "商业服务": "10900", "贸易/批发/零售": "10300",
                 "教育/艺术": "10400", "服务业": "10000", "文化/传媒/娱乐": "11300", "制造业": "10500", "物流运输": "11500",
                 "能源/环保": "11600", "政府/非盈利": "11100", "农林牧渔": "11400"}
    dict1["hangyenum"] = hangyenum[hangye]
    if dict1["hangyenum"]!="":
        return dict1
    else:
        print("配置文件行业中参数缺失")

 #总页数
def zongyeshu(self,page):
    startpage=1
    try:
         # page=int(input('输入总页数:'))
        page=int(page)
    except:
        print('输入有误!!!')
        self.zongyeshu()
    if page!="":
        return startpage,page
    else:
        print("配置文件总页数缺失")

有啥可以帮助的可以联系1307761253

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
数据采集 小程序 Ruby
如何使用Ruby 多线程爬取数据
如何使用Ruby 多线程爬取数据
|
数据采集 存储 Python
多线程+代理池如何爬取新闻数据
多线程+代理池如何爬取新闻数据
|
数据采集 前端开发 数据挖掘
python多线程爬取汽车数据
python如何使用多线获取网站数据
python多线程爬取汽车数据
|
Python
Python 多线程爬取西刺代理
西刺代理是一个国内IP代理,由于代理倒闭了,所以我就把原来的代码放出来供大家学习吧。
140 0
Python 多线程爬取西刺代理
|
Web App开发 XML 安全
使用队列多线程爬取代理IP以及验证IP可用性
使用队列多线程爬取代理IP以及验证IP可用性
244 0
|
Web App开发 数据采集 Python
Python爬虫入门教程 11-100 行行网电子书多线程爬取
行行网电子书多线程-写在前面 最近想找几本电子书看看,就翻啊翻,然后呢,找到了一个 叫做 周读的网站 ,网站特别好,简单清爽,书籍很多,而且打开都是百度网盘可以直接下载,更新速度也还可以,于是乎,我给爬了。
1758 0
|
数据采集 存储 Python
Python爬虫入门教程 14-100 All IT eBooks多线程爬取
1.All IT eBooks多线程-写在前面对一个爬虫爱好者来说,或多或少都有这么一点点的收集癖 ~ 发现好的图片,发现好的书籍,发现各种能存放在电脑上的东西,都喜欢把它批量的爬取下来。 然后放着,是的,就这么放着.......然后慢慢的遗忘掉.....All IT eBooks多线程-爬虫分析打开网址 http://www.allitebooks.com/ 发现特别清晰的小页面,一看就好爬在点击一本图书进入,发现下载的小链接也很明显的展示在了我们面前,小激动一把,这么清晰无广告的网站不多见了。
14108 0
|
数据采集 Python Web App开发
Python爬虫入门教程 13-100 斗图啦表情包多线程爬取
1.准备爬取斗图la写在前面 今天在CSDN博客,发现好多人写爬虫都在爬取一个叫做斗图啦的网站,里面很多表情包,然后瞅了瞅,各种实现方式都有,今天我给你实现一个多线程版本的。关键技术点 aiohttp ,你可以看一下我前面的文章,然后在学习一下。
1883 0
|
数据采集 Python
Python爬虫入门教程 10-100 图虫网多线程爬取
1.图虫网多线程爬取-写在前面 经历了一顿噼里啪啦的操作之后,终于我把博客写到了第10篇,后面,慢慢的会涉及到更多的爬虫模块,有人问scrapy 啥时候开始用,这个我预计要在30篇以后了吧,后面的套路依旧慢节奏的,所以莫着急了,100篇呢,预计4~5个月写完,常见的反反爬后面也会写的,还有fuck login类的内容。
3179 0
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
55 1
C++ 多线程之初识多线程