招聘网站爬虫模板

招聘网站爬虫模板

  1. 项目的创建
  2. 项目的设置
  3. 中间件的理解与使用
  4. selenium的基本使用

爬虫项目的创建:

  1. scrapy startproject spiderName
  2. cd spiderName
  3. scrapy genspider name www.xxx.com

项目的设置:

settings的基础设置:

  1. USER_AGENT='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'
    
  2. ROBOTSTXT_OBEY = False	#关闭协议
    LOG_LEVEL = 'ERROR'		#日志输出最低等级
    
  3. DOWNLOADER_MIDDLEWARES = {	#开启下载器中间件
       # 'TZemployment.middlewares.TzemploymentDownloaderMiddleware': 543,
       'TZemployment.middlewares.自定义中间件名字': 543,
    
    }
    
  4. ITEM_PIPELINES = {	#开启item
       'TZemployment.pipelines.TzemploymentPipeline': 300,
    }
    

中间件的理解与使用:

虽然中间件网上的示意图都烂大街了,我还是想贴一下;

中间件分为下载器中间件与爬虫中间件,我们常说的中间件为下载器中间件;

定义(官方解释):

​ 下载器中间件是位于引擎和下载器之间的特定挂钩,它们在从引擎传递到下载器时处理请求,以及从下载器传递到引擎的响应。

如果需要执行以下操作之一,请使用Downloader中间件:

  • 在将请求发送到下载器之前处理请求(即,在Scrapy将请求发送到网站之前);
  • 在将接收到的响应传递给蜘蛛之前,先对其进行更改;
  • 发送新的请求,而不是将收到的响应传递给蜘蛛;
  • 将响应传递给蜘蛛,而无需获取网页;
  • 默默地丢弃一些请求。

说人话就是:所有的请求与响应都会经过它,我们可以截取并修改成我们需要的形式或功能;

下载器中间件的好处:

  • 可以集成Selenium、重试和处理请求异常等
  • 我们就是用到了Selenium在中间件中对接scrapy;

selenium在中间件中的使用:

selenium的基本语法:

推荐该网站:http://www.testclass.net/selenium_python

image-20200920212307797

通过selenium中的page_source获取网页源码,发送至spider下的parse进行xpath解析。

# -*- coding: utf-8 -*-
from scrapy import signals
from scrapy.http import HtmlResponse
import time


#设置selenium的中间件
class SelemiumSpiderMiddleware(object):
    #对发送的
    def process_request(self,request,spider):
		#通过spider调用spider下的driver属性
        spider.driver.get(request.url)
        time.sleep(1)
        page_text = spider.driver.page_source

        return HtmlResponse(url=request.url,body=page_text,request=request,encoding='utf-8')

存储部分:(pipelines模块)

该存储功能如下,代码暂时不开放;

调用外部文件,自动建库建表,对MySQL中的数据进行检测是否重复;

主函数spider配置:

# -*- coding: utf-8 -*-

import scrapy
from selenium import webdriver
#from .. import items
from TZtalent.items import TztalentItem
#from 主项目名.items import items中的类
class TzcodeSpider(scrapy.Spider):
    #泰州就业人才网
    name = 'tzcode'
    # allowed_domains = ['www.xxx.com']
    #不需要动,改相应的配置信息即可
    #传参
    def __init__(self,table_name,keyword,webhook,*args,**kwargs):
        super(TzcodeSpider, self).__init__(*args, **kwargs)
        # path = r"C:UsersAdministratorDesktopphantomjs-1.9.2-windowsphantomjs.exe"
        # self.driver = webdriver.PhantomJS(executable_path=path)
        #防止selenium识别
        options = webdriver.ChromeOptions()
        options.add_experimental_option("excludeSwitches", ["enable-automation"])
        options.add_experimental_option('useAutomationExtension', False)
        self.driver = webdriver.Chrome(options=options)
        self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": """
            Object.defineProperty(navigator, 'webdriver', {
              get: () => undefined
            })
          """
        })
        # self.driver = webdriver.Chrome()
        ##灵活变动,有的网站统一是gb2312编码,需要将URL进行转换--urlencode编码
        #self.keyword = quote(keyword.encode("gb2312"))
        self.keyword = keyword
        self.webhook_url = webhook
        self.table_name = table_name
        self.start_urls =[f"-----------url------{self.keyword}"]
	
    #解析selenium发过来的response数据
    def parse(self, response):
        # print(response.url)
        #父标签---所需要信息标签上的父标签
        div_list = response.xpath("父标签xpath语法")
        item = TzemploymentItem()
        for div in div_list:
            item['title'] = div.xpath("./匹配的title信息xpath").extract_first()
            #判断title是否为空
            if item['title'] == None:
                break
            item['company_name'] = div.xpath("./匹配的company_name信息xpath").extract_first()
            item['company_url'] = div.xpath("./匹配的company_url信息xpath").extract_first()
            item['site'] = div.xpath('./匹配的site信息xpath').extract_first()
            yield items
    #
    def __del__(self):
        #退出驱动并关闭所有关联的窗口
        self.driver.quit()

传参并启动爬虫:

#spider中url与xpath配置完成后,进行参数设置
from scrapy import cmdline
cmdline.execute("scrapy crawl tzcode -a table_name=表名 -a keyword=java -a webhook=".split())

适用范围:

  • 网站反爬不强的地方网站;
  • 51job、拉钩等可使用。

注:

  • 仅用于技术交流学习,不承担任何责任。
原文地址:https://www.cnblogs.com/xbhog/p/13702469.html