首先准备python3+scrapy+mysql+pycharm。。。

这次我们选择爬取智联招聘网站的企业招聘信息,首先我们有针对的查看网站的html源码,发现其使用的是js异步加载的方式,直接从服务端调取json数据,这就意味着我们用地址栏的网址获取的网站内容是不全的,无法获得想要的数据。

那么我们用什么方式获取想要的数据呢,正所谓道高一尺魔高一丈,有反爬虫就有范反爬虫,当然我们不用那么麻烦,通过分析页面的加载有针对性的抓包获取信息进行分析,我们会发现每次刷新或者搜索页面时候,除了会加载许多图片、广告等信息外,还加载了一个包,这个包里就有我们想要的所有信息,并且服务端都给我们打包成json格式了,这样看似复杂,实则简化了我们对数据进行过滤的步骤。

直接从头文件中找到请求的url源头,那么就能直接获取json数据了。 怎么样是不是感受到了世界的友好呢?

分析完毕,接下来就可以编写爬虫数据了。。。

一、创建爬虫项目

在命令行中在指定的目录创建爬虫项目

scrapy startproject zhilian

然后就是创建爬虫文件

scrapy genspider zhaopin "sou.zhaopin.com"  
#要把http://www去掉因为爬虫项目运行时会自动加上,这里也是为了避免不必要的错误

二、编写程序

首先编写item文件,我们有选择的爬取几个关键数据

import scrapy

class ZhilianItem(scrapy.Item):
# 岗位名称
jobName = scrapy.Field()
# 公司名称
companyName = scrapy.Field()
# 工作地点
workSite = scrapy.Field()
# 更新日期
updateDate = scrapy.Field()
# 薪资水平
salaryLevel = scrapy.Field()
# 岗位关键词
jobKeyWord = scrapy.Field()

然后就是编写爬虫文件了我们的命名为zhaopin.py

# -*- coding: utf-8 -*-
import json import scrapy
from zhilian.items import ZhilianItem class zhaopinSpider(scrapy.Spider):
name = 'javaDevelop'
allowed_domains = ['sou.zhaopin.com']
offset = 0
url1 = "https://fe-api.zhaopin.com/c/i/sou?start="
url2 = "&pageSize=90&cityId=530&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E7%BB%8F%E6%B5%8E&kt=3"
start_urls = (
url1 + str(offset) + url2,  #此为我们简化后的网址,网址的规律相当简单,简单试试就找到规律了
) print(start_urls)
def parse(self, response):for flag in range(0, 90):
item = ZhilianItem()
job = json.loads(response.text)['data']['results'][flag] # 岗位名称
item['jobName'] = job['jobName']
# 公司名称
item['companyName'] = job['company']['name']
# 工作地点
item['workSite'] = job['city']['display']
# 更新日期
item['updateDate'] = job['updateDate']
# 薪资水平
item['salaryLevel'] = job['salary']
# 岗位关键词
item['jobKeyWord'] = job['welfare']
yield item if self.offset < 450:
self.offset += 90
yield scrapy.Request(self.url1 + str(self.offset) + self.url2, callback=self.parse, dont_filter=True)
       #dont_filter=True这个参数相当重要,指不过滤url直接爬取。否则你会发现你的爬虫爬取完第一页后就不会再爬取了,这样是因为url与爬取域url不符,爬虫自动认为爬取结束

接下来就是写管道文件了,这里我用了两种方式,一种是写到数据库中,还有一种是写道本地txt文件中

import pymysql

class zhaoPipeline(object):
def __init__(self):
self.conn = pymysql.connect(host='172.18.96.151', user='root',
password='123456', db='zhilian', charset='utf8'
)
self.cur = self.conn.cursor() def process_item(self, item, spider):
# 岗位名称
jobName = item['jobName']
# 公司名称
companyName = item['companyName']
# 工作地点
workSite = item['workSite']
# 官网链接
updateDate = item['updateDate']
# 薪资水平
salaryLevel = item['salaryLevel']
# 岗位关键词
jobKeyWord = item['jobKeyWord']
data = [jobName, companyName, workSite, updateDate, salaryLevel, ','.join(jobKeyWord)]
print(data)
print("======================================")
sql = """
insert into zhaopin (jobname,companyname,worksite,updatedate,salarylevel,jobkeyword) values
(%s,%s,%s,%s,%s,%s)
"""
# self.conn.ping(reconnect=True)
self.cur.execute(sql, data)
self.conn.commit() def close_spider(self, spider):
self.cur.close()
self.conn.close() class ZhilianPipeline(object):
def __init__(self):
self.filename = open("java.txt", 'wb')
# self.path = "G:\images\p"
# if not os.path.exists(self.path):
# os.mkdir(self.path) def process_item(self, item, spider):
# 岗位名称
jobName = item['jobName']
# 公司名称
companyName = item['companyName']
# 工作地点
workSite = item['workSite']
# 官网链接
updateDate = item['updateDate']
# 薪资水平
salaryLevel = item['salaryLevel']
# 岗位关键词
jobKeyWord = item['jobKeyWord'] self.filename.write(jobName.encode('utf-8') + ' '.encode('utf-8')
+ companyName.encode('utf-8') + ' '.encode('utf-8')
+ workSite.encode('utf-8') + ' '.encode('utf-8')
+ updateDate.encode('utf-8') + ' '.encode('utf-8')
+ salaryLevel.encode('utf-8') + ' '.encode('utf-8')
+ ','.join(jobKeyWord).encode('utf-8') + '\n'.encode('utf-8'))
return item def close_spider(self, spider):
self.filename.close()

手把手教学,我们附上建立库语句

create table zhaopin
(id int(10) not null primary key AUTO_INCREMENT,
jobname varchar(40),
companyname varchar(20),
worksite varchar(10),
updatedate datetime,
salarylevel varchar(10),
jobkeyword varchar(40)
);

然后就剩下最后的设置setting了,下面三个关键的地方要改

ROBOTSTXT_OBEY = False

DEFAULT_REQUEST_HEADERS = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36',
# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
}

ITEM_PIPELINES = {
'zhilian.pipelines.ZhilianPipeline': 300,
'zhilian.pipelines.zhaoPipeline': 200,
}

三、运行爬虫

scrapy crawl zhaopin

等待片刻,刷新数据表

OVER。。。

python-scrapy爬取某招聘网站信息(一)的更多相关文章

  1. Python——Scrapy爬取链家网站所有房源信息

    用scrapy爬取链家全国以上房源分类的信息: 路径: items.py # -*- coding: utf-8 -*- # Define here the models for your scrap ...

  2. 使用python scrapy爬取知乎提问信息

    前文介绍了python的scrapy爬虫框架和登录知乎的方法. 这里介绍如何爬取知乎的问题信息,并保存到mysql数据库中. 首先,看一下我要爬取哪些内容: 如下图所示,我要爬取一个问题的6个信息: ...

  3. python scrapy爬取前程无忧招聘信息

    使用scrapy框架之前,使用以下命令下载库: pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple 1.创建项目文件夹 scr ...

  4. python爬虫爬取ip记录网站信息并存入数据库

    import requests import re import pymysql #10页 仔细观察路由 db = pymysql.connect("localhost",&quo ...

  5. scrapy爬取西刺网站ip

    # scrapy爬取西刺网站ip # -*- coding: utf-8 -*- import scrapy from xici.items import XiciItem class Xicispi ...

  6. 网络爬虫之scrapy爬取某招聘网手机APP发布信息

    1 引言 过段时间要开始找新工作了,爬取一些岗位信息来分析一下吧.目前主流的招聘网站包括前程无忧.智联.BOSS直聘.拉勾等等.有段时间时间没爬取手机APP了,这次写一个爬虫爬取前程无忧手机APP岗位 ...

  7. python爬虫学习之使用BeautifulSoup库爬取开奖网站信息-模块化

    实例需求:运用python语言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html这个开奖网站所有的信息,并且保存为txt文件和excel文件. 实 ...

  8. python scrapy爬取HBS 汉堡南美航运公司柜号信息

    下面分享个scrapy的例子 利用scrapy爬取HBS 船公司柜号信息 1.前期准备 查询提单号下的柜号有哪些,主要是在下面的网站上,输入提单号,然后点击查询 https://www.hamburg ...

  9. 利用 Scrapy 爬取知乎用户信息

    思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息. 一 ...

随机推荐

  1. [从源码学设计]蚂蚁金服SOFARegistry之消息总线异步处理

    [从源码学设计]蚂蚁金服SOFARegistry之消息总线异步处理 目录 [从源码学设计]蚂蚁金服SOFARegistry之消息总线异步处理 0x00 摘要 0x01 为何分离 0x02 业务领域 2 ...

  2. 简单dp水题

    #include <bits/stdc++.h> using namespace std; #define limit (100 + 5)//防止溢出 #define INF 0x3f3f ...

  3. 转:使用DOS命令chcp查看windows操作系统的默认编码以及编码和语言的对应关系

    代码页是字符集编码的别名,也有人称"内码表".早期,代码页是IBM称呼电脑BIOS本身支持的字符集编码的名称.当时通用的操作系统都是命令行界面系统,这些操作系统直接使用BIOS供应 ...

  4. Python正则表达式re.search(r'\*{3,8}','*****')和re.search('\*{3,8}','*****')的匹配结果为什么相同?

    老猿做过如下测试: >>> re.search(r'\*{3,100}','*****') <re.Match object; span=(0, 5), match='**** ...

  5. PyQt Designer中连接信号和槽时为什么只能连接控件自己的信号和槽函数?

    老猿在学习ListView组件时,想实现一个在ListView组件中选中一个选择项后触发消息给主窗口,通过主窗口显示当前选中的项的内容. 进入QtDesigner后,设计一个图形界面,其中窗口界面使用 ...

  6. PyQt(Python+Qt)学习随笔:clicked和clicked(bool)信号连接同名函数出现的问题

    在Qt中,控件中的clicked()信号和clicked(bool)信号是两个不同的信号,映射槽函数时,clicked()信号映射到的槽函数是不带参的,clicked(bool)信号映射到的槽函数是带 ...

  7. PCANBasic开发(二)

    使用Peak的PCan转换器开发,使用其中的PCanBasic.dll // PCANBasic.cs // // ~~~~~~~~~~~~ // // PCAN-Basic API // // ~~ ...

  8. Big Sur 11.0.1 让2K屏幕开启Hidpi

    首先来个成果图: 一.复制显示器配置文件 终端输入命令:cd /System/Library/Displays/Contents/Resources/Overrides 接着输入:open . 打开D ...

  9. 微信小程序云开发如何上手

    简要介绍 微信小程序云开发,是基于 Serverless 的一站式后端云服务,涵盖函数.数据库.存储.CDN等服务,免后端运维.基于云开发可以免鉴权调用微信所有开放能力. 前提准备 微信开发者工具 创 ...

  10. 手机版LED弹幕显示屏

    这是一款可以自制超大滚动字幕的LED显示屏APP.可以随你喜欢, 演唱会,电竞比赛,晚会,接机,寻人! 随时随地输入文字, 传达讯息,酒吧夜店疯狂打Call工具!蹦迪必备!超帅!下载地址:https: ...