欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

scrapy实战一:爬取boss直聘信息,存入mysql数据库

程序员文章站 2022-04-26 10:00:24
...

scrapy版本:1.5

python版本:3.6

系统:windows

网站链接: www.zhipin.com

1 创建项目

CTRL+R 输入cmd打开DOS窗口,输入如下命令创建项目(可自定义项目位置)

scrapy startproject job_demo   

scrapy实战一:爬取boss直聘信息,存入mysql数据库

从图片中可以看到,你可以进入你的项目然后创建你的spider

cd Job_demo

新建spider蜘蛛

scrapy genspider job www.zhipin.com

scrapy实战一:爬取boss直聘信息,存入mysql数据库


2 编写项目

整个项目的结构如下

scrapy实战一:爬取boss直聘信息,存入mysql数据库

在爬去之前,我们先要明确好,需要爬取得东西,以python爬虫工程师为例

1 职位名称

2 工资

3 公司名称

4 公司地点

scrapy实战一:爬取boss直聘信息,存入mysql数据库

items代码

import scrapy

class JobDemoItem(scrapy.Item):
  
    name = scrapy.Field()   #公司名
    title = scrapy.Field()  #岗位名
    wage = scrapy.Field()   #工资
    site = scrapy.Field()   #地点

审查元素示例

scrapy实战一:爬取boss直聘信息,存入mysql数据库

spider代码

import scrapy
from Job_demo.items import  JobDemoItem

class JobSpider(scrapy.Spider):
    name = 'job'
    allowed_domains = ['www.zhipin.com']
    start_urls = ['https://www.zhipin.com/c101010100/h_101010100/?query=python爬虫&page=1']

    def parse(self, response):
        body = response.css(".job-primary")
        for head in body:
            item = JobDemoItem()
            item["title"] = head.css(".job-title::text").extract()[0]
            item["wage"] = head.css(".red::text").extract()[0]
            item['site'] = head.css(".info-primary p::text").extract_first().strip()
            item['name'] = head.css(".company-text .name a::text" ).extract_first()
            yield item
        # 翻页
        next_page = response.css(".page .next::attr(href)").extract()[0]
        if next_page is not None:
            yield response.follow('https://www.zhipin.com'+next_page,callback=self.parse) #从上图中可以看的出链接并不完全,需要我们补充。
            

pipeline.py代码

import pymysql.cursors
class JobDemoPipeline(object):

    def process_item(self, item, spider):
        self.cursor.execute(
            '''insert into 51job(`name`,title,site,wage)
              value (%s,%s,%s,%s)''',
            #将item['name'],item['title'],item['site'],item['wage']数据插入表51job中,注意,必须相对应
            (item['name'],item['title'],item['site'],item['wage']))
        #提交sql语句
        self.connect.commit()
        return item

    def __init__(self):
        #链接数据库
        self.connect = pymysql.connect(
            host= 'localhost', #数据库地址
            port= 3306,         #数据库端口
            db= 'scrapydb',     #数据库名
            user = 'root',      #用户名
            passwd='root',      #密码
            charset='utf8',     #编码方式,如果不注意可能会乱码
            use_unicode=True,
        )
        #通过cursor执行增删改查
        self.cursor = self.connect.cursor()

setting.py代码需要修改如下

#开启item管道

ITEM_PIPELINES = {

'Job_demo.pipelines.JobDemoPipeline': 300, }
ROBOTSTXT_OBEY = False #不遵从机器人协议

在数据库中新建表51job 并创建 相应的name title wage site字段。我给51job表创建了id字段并设置为唯一且自增。

最后启动爬虫

scrapy crawl job

爬取完毕后刷新51job表就能看到如下变化啦

scrapy实战一:爬取boss直聘信息,存入mysql数据库

相关标签: scrapy