request携带cookie爬虫爬取招聘网站(多页),保存到mysql和sqlite数据库

4 篇文章 1 订阅
3 篇文章 0 订阅

request携带cookie爬虫爬取招聘网站(多页),保存到mysql/sqlite数据库

Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息 。

简而言之,cookie代表了你的身份,你是否登陆了,就通过它进行识别,这就很好的解决了当一个爬虫进行数据爬取,要求你是登录状态的时候,以及可以进行数据的爬取

1、携带数据-请求头header

一个基本的爬虫应该包含基础的header即请求头,而请求头中包含了一些爬虫的模拟信息,毕竟一个网站对于一个基础的爬虫可并不友好,我们的cookie也是从中获取

    headers1 = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Cookie': cookie1,
        'Pragma': 'no-cache',
        'Referer': 'https://xxxx.com',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-origin',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest',
    }

header的各个字段的意思

[header各个字段的意思

cookie的获取,我找了个大家可以看下

2、xpath提取数据

爬虫其实一共就分为两步,第一,获取数据,第二,把获取到的数据封装保存

往往是第一步最难,因为获取数据的过程可能有反爬,反爬之后还要对数据进行定位,本次我们使用xpath进行定位,简单来说,xpath就是你f12之后看到的网页代码,呈现的是树状结构,xpath就是通过这个树状结构对数据进行定位

xpath教程(菜鸟教程的,感兴趣的可以深入了解一下)

核心爬虫代码

import time
import requests
from lxml.etree import HTML
import os
import pandas as pd
from sqlalchemy import create_engine
#对爬取的数据进行初步调整
def check(a):
    经验=''
    学历=''
    for i in a:
        if '经验' in i or '在校生' in i:
            经验=i
            continue
        if '硕士' in i or '大专' in i or '本科' in i or '高中' in i or '初中' in i or '博士' in i:
            学历 = i
            continue

    return 经验,学历
#输入cookie进行数据爬取
cookie1=input('请输入列表cookie:')
#输入页码
startpage=input('请输入开始页码:')
endpage=input('请输入开始页码:')
#循环页码开始爬虫
for page in range(int(startpage),int(endpage)):
    url=f'https://xxxx.com/{page}.html?'
    headers1 = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Cookie': cookie1,
        'Host': 'search.xxxx.com',
        'Pragma': 'no-cache',
        'Referer': 'https://xxxx.com/list?',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-origin',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest',
    }
    headers2 = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Cookie': cookie1,
        'Host': 'jobs.xxxx.com',
        'Pragma': 'no-cache',
        'Referer': 'https://xxxx.com',
        'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'Sec-Fetch-Dest': 'document',
        'Sec-Fetch-Mode': 'navigate',
        'Sec-Fetch-Site': 'same-origin',
        'Sec-Fetch-User': '?1',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36',
    }
    #获取数据,并且分别把数据放进去
    res=requests.get(url,headers=headers1).json()
    for i in res['engine_jds']:
        company_name=i['company_name']
        job_title=i['job_title']
        providesalary_text=i['providesalary_text']
        updatedate=i['updatedate']
        workarea_text=i['workarea_text']
        attribute_text=i['attribute_text']
        经验, 学历 = check(attribute_text)
        jobwelf=i['jobwelf']
        job_href=i['job_href']
        res_href = requests.get(job_href, headers=headers2).content
        try:
            res_href=res_href.decode('gbk')
        except:
            res_href = res_href.decode('utf8')
        if '滑动验证页面' in res_href:
            print('出现滑动检测请注意****************************************')
        zhiwei=''.join(HTML(res_href).xpath(r'//div[@class="bmsg job_msg inbox"]//text()'))
        leibie = ''.join(HTML(res_href).xpath(r'//div[@class="mt10"]/p[1]/a/text()'))
        #把数据放进去
        data={
            '职位名称': job_title,
            '公司名字': company_name,
            '工作城市': workarea_text,
            '经验要求': 经验,
            '学历要求': 学历,
            '薪资水平': providesalary_text,
            '福利待遇': jobwelf,
            '职位详情页': job_href,
            '职位信息': zhiwei,
            '职能类别': leibie,
        }
        #把数据格式转化为Dataframe
        df=pd.DataFrame([data])
        savepath=r'xxxx24hour_1.csv'
        if not os.path.exists(savepath):
            df.to_csv(savepath,index=False,mode='a')
        else:
            df.to_csv(savepath, index=False, mode='a', header=None)
        print(data)
        time.sleep(2)
3、保存到数据库

数据库这个名字很高大上,但是如果深入了解就会发现,数据库就是一个本地有结构的大型存储文件–也就是说,你可以把它理解为一个文件夹,每个数据库是一个文件夹,文件夹下面有很多个excel表格,只是这些表格之间有着其很多的规则

本次我们使用两个数据库,分别是mysql和sqlite:

其实核心逻辑都是一样的,连接到本地sql服务,循环我们的数据执行对应的sql代码(英语好就能直接理解:比如insert into就是插入数据)

把数据插入mysql
import pandas as pd
import pymysql
import csv
import codecs
data = pd.read_csv(file_path, encoding='utf-8')
def get_conn():
    db = pymysql.connect(host='localhost',
                         user='root',
                         password='xxxx',
                         database='xxxx',
                         charset='utf8')
    return db
def insert(cur, sql, args):
    try:
        cur.execute(sql, args)
    except Exception as e:
        print(e)
def read_csv_to_mysql(filename):
    '''
    csv文件->数据库
    :param filename:
    :return:
    '''
    with codecs.open(filename=filename, mode='r', encoding='utf-8') as f:
        reader = csv.reader(f)
        head = next(reader)
        # print(head)
        conn = get_conn()
        cur = conn.cursor()
        sql = 'insert into job(job_name, company_name, job_city, expirence, degree, salary_degree, walfare, work_detail, work_information, work_type) values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'
        for item in reader:
            # if item[1] is None or item[1] == '':  # item[1]作为唯一键,不能为null
            #     continue
            args = tuple(item)
            # print(args)
            insert(cur, sql=sql, args=args)
        conn.commit()
        cur.close()
        conn.close()
if __name__ == '__main__':
    read_csv_to_mysql("new_xxxx.csv")
把数据插入sqlite
import sqlite3
import time
import pandas as pd
import pymysql
import csv
import codecs
#初始化sqlite的操作的类---这是固定的,综合起来就是连接数据库,提供执行数据库的方法
#execute_sql执行单条数据
#executemany_sql执行多条数据
# sqlite3--
# mysql
class DbOperate(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            cls._instance = super(DbOperate, cls).__new__(cls)
        return cls._instance

    def __init__(self, db_name):
        self.db_name = db_name
        self.connect = sqlite3.connect(self.db_name)
        self.cursor = self.connect.cursor()

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.connect.close()

    def execute_sql(self, sql,values):
        try:
            self.cursor.execute(sql,values)
            self.connect.commit()
        except Exception as e:
            self.connect.rollback()

    def executemany_sql(self, sql, data_list):
        # example:
        # sql = 'insert into filelist (pkgKey, dirname, filenames, filetypes) values (?, ?, ?, ?);'
        # data_list = [(1, '/etc/sysconfig', 'openshift_option', 'f'), (1, '/usr/share/doc', 'adb-utils-1.6', 'd')]
        try:
            self.cursor.executemany(sql, data_list)
            self.connect.commit()
        except Exception as e:
            self.connect.rollback()
            raise Exception("executemany failed")

#sql文件的地址
sqlite_path = "../my.db"
#打开sql文件,执行插入操作
with DbOperate(sqlite_path) as db:
    sql = "insert into job(job_name, company_name, job_city, expirence, degree, salary_degree, walfare, work_detail, work_information, work_type,province) values(?,?,?,?,?,?,?,?,?,?,?)"
    #打开csv文件,分别将数据取出插入数据库
    with codecs.open(filename="new_xxxx.csv", mode='r', encoding='utf8') as f:
        reader = csv.reader(f)
        head = next(reader)
        # print(head)
        # sql = 'insert into job(job_name, company_name, job_city, expirence, degree, salary_degree, walfare, work_detail, work_information, work_type) values(?,?,?,?,?,?,?,?,?,?)'
        lis = []
        for item in reader:
            lis.append(tuple(item))
        db.executemany_sql(sql, tuple(lis))
            # insert(cur, sql=sql, args=args)
总结

sqlite的优点在于可以直接带走,类似于钱包

对于数据库没有特别大的需求的话(非大量数据比如千万级别)其实sqlite是比较友好的

而mysql也有众多的优点
一篇非常优秀的mysql和sqlite对比的文章

本文做过敏感处理,需要代码欢迎github自取

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件名称: 智睿学校网站管理系统 英文简称: ZhiRui_Shool 软件版本: VER 2.7.0 智睿学校网站系统: 定位教育网行开发的系统,网站首页 学校概况 校园新闻 德育教学 校园风彩 资源下载 求贤纳士 成绩查询 网上报名 联系我们 校园信箱等学校网站常用的栏目,采用当前学校网站的适用性,增强了系统的针对性和易用性,适合创建中、小学校,大中院校,技校使用 。 网站简介 网站首页 - 预设学校概况、校园新闻、德育教学、校园风彩、资源下载、求贤纳士、成绩查询、网上报名、联系我们、校园信箱等版块任意修改导航设置。 学校概况 - 学校简介、学校领导、机构设置、校园风貌、教师风采 校园新闻 - 校内新闻、领导关怀、教育新闻、媒体报道 德育教学 - 学校简介、学校领导、机构设置、校园风貌、教师风采 资源下载 - 教学日常、优秀课件、优秀教案、办公软件 成绩查询 - 学生的成绩查询,EXCEL批量导入 简繁转换 - 极速切换简繁字体,方便灵活 校园风彩 - 学生刊物、学生活动、学生之星、学生作品 人员招聘 - 学校的相关人才信息招聘 网上报名 - 在线报名,转校报名 会员功能 - 会员的报名功能和成绩功能 20110317正: 1、修正导航二级背景图显示 2、优化首页框架显示结构 20110215修正: 1、修复CSS模块栏目显示 2、调配上传附件功能增大 3、优化会员中心显示模块 20110104修正: 1、删除编辑器在IE8上错位 2、新增CKeditor3.5新版编辑 3、会员发布加载编辑模块 20101212修正: 1、修正编辑器错位版块 2、修正扩展清空无法加内容 3、修正评论回复显示功能 4、新增编辑FLASH和视频功能 5、新增横FLASH模块展示 20101202修正: 1、修定关于我们版块显示 2、修正底部的联系错位显示 3、调整首页的框架优化显示 20101101修正: 1、修正内页图片展示链接 2、修正管理权限有效显示 20101008修正: 1、修正后台管理的权限划分 2、加载后台内容的名称搜索 3、优化去除不必要的文件 20100902修正: 1、广告加载链接字符加长修正 2、后台安全密码修改 3、修正报名版块的提交出错修复 4、删除库备份修正防注安全 20100713修正: 1、修正优化远程批量XLS导入功能 2、查询成绩科目增加 20100531修正: 1、新增修复批量导航EXCEL成线 2、加载会员注册登陆防SQL注入 3、修正关于我们部分错位 20100420修正: 1、修正登陆后新版IE的高度显示 2、增加留言的字符过滤显示功能 3、加载会员注册登陆防SQL注入 4、修定防注入中的安全过滤函数 20100121修正: 1、增加网站开关功能 2、增加网站转向功能 3、增加学员发布审核开关 4、修正会员在IE8错位CSS 20100110修正: 1、修正编辑器不能粘贴功能 2、增加WORD导入及控件加载功能 3、修正会员我的作品显示模块 20091210修正: 1、紧急修复防安全注入功能 2、加入防cookie,post,get注入功能 3、加强修改数字过滤函数库 4、去除会员的删除功能 20091124修正: 1、增加会员模块功能 2、增加会员自主上传管理功能,可发表作品 3、增加会员多图上传功能。 4、修正评论放在二级的不显示 20091111修正: 1、修正底部的错误邮件更正为电话 2、修正后台德育管理的的导航修正 3、新增成绩管理的EXCEL导入功能,更有效的快捷 4、更改后台的数据备案安全过滤替换 功能模块 栏目管理系统 - 自由创建栏目频道,设置栏目名称和显示参数 新闻文章系统 - 任意创建多个文章频道,灵活设置频道 图文发布系统 - 任意创建多个图文频道,灵活设置频道 学员作品系统 - 可以前后台自主审核增加学生风采相关作品 网站广告系统 - 具有页内广告、FLASH广告等多种形式 成绩查询系统 - 每班级,每学员的相关考核成绩 网上报名系统 - 相关学员的网上报名相关入校信息

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值