首先准备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. springboot多模块项目搭建遇到的问题记录

    废话不多说,直接上问题报错与解决方法. 问题报错一:(报错信息看下方代码) 问题原因:'com.company.logistics.service.company.CompanyService' 未找 ...

  2. PyQt(Python+Qt)学习随笔:QTreeWidgetItem项是否首列跨所有列展示属性isFirstColumnSpanned

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeWidget树型部件的QTreeWidgetItem项方法isFirstColumnSpa ...

  3. 笔记-[AH2017/HNOI2017]礼物

    笔记-[AH2017/HNOI2017]礼物 [AH2017/HNOI2017]礼物 \[\begin{split} ans_i=&\sum_{j=1}^n(a_j-b_j+i)^2\\ =& ...

  4. Mysql为什么使用b+树,而不是b树、AVL树或红黑树?

    首先,我们应该考虑一个问题,数据库在磁盘中是怎样存储的?(答案写在下一篇文章中) b树.b+树.AVL树.红黑树的区别很大.虽然都可以提高搜索性能,但是作用方式不同. 通常文件和数据库都存储在磁盘,如 ...

  5. WebFlux中thymeleaf视图找不到的问题解决

    由于在weblux临时增加一个H5的页面,发生如下错误 Whitelabel Error Page This application has no configured error view, so ...

  6. Python编码相关

    1.#coding=utf-8的作用 作用是这个文件代码的编码格式,如果没有声明代码中不能出现中文字符,包括注释中也不能出现.否则会报错SyntaxError: Non-ASCII character ...

  7. Struts2 S2-061漏洞复现(CVE-2020-17530)

    0x01 漏洞描述 Struts2 会对某些标签属性(比如 `id`,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 `%{x}` 且 `x` 的值用户可控时,用户再传入一 ...

  8. Object not found! The requested URL was not found on this server.... 报错解决方案

    服务器(centos6.5) lnmp 报错如下 Object not found! The requested URL was not found on this server. The link ...

  9. .net core 和 WPF 开发升讯威在线客服与营销系统:背景和产品介绍

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf-m.shengxunwei.com ...

  10. SecureCRT无法退格删除

    SecureCRT无法退格删除 securecrt无法退格删除问题解决: 如果想要全部会话都可以实现退格删除的功能,需要在全局选项设置. 最后选择全局应用即可.