招聘网站爬虫模板
- 项目的创建
- 项目的设置
- 中间件的理解与使用
- selenium的基本使用
爬虫项目的创建:
- scrapy startproject spiderName
- cd spiderName
- scrapy genspider name www.xxx.com
项目的设置:
settings的基础设置:
-
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'
-
ROBOTSTXT_OBEY = False #关闭协议 LOG_LEVEL = 'ERROR' #日志输出最低等级
-
DOWNLOADER_MIDDLEWARES = { #开启下载器中间件 # 'TZemployment.middlewares.TzemploymentDownloaderMiddleware': 543, 'TZemployment.middlewares.自定义中间件名字': 543, }
-
ITEM_PIPELINES = { #开启item 'TZemployment.pipelines.TzemploymentPipeline': 300, }
中间件的理解与使用:
虽然中间件网上的示意图都烂大街了,我还是想贴一下;
中间件分为下载器中间件与爬虫中间件,我们常说的中间件为下载器中间件;
定义(官方解释):
下载器中间件是位于引擎和下载器之间的特定挂钩,它们在从引擎传递到下载器时处理请求,以及从下载器传递到引擎的响应。
如果需要执行以下操作之一,请使用Downloader中间件:
- 在将请求发送到下载器之前处理请求(即,在Scrapy将请求发送到网站之前);
- 在将接收到的响应传递给蜘蛛之前,先对其进行更改;
- 发送新的请求,而不是将收到的响应传递给蜘蛛;
- 将响应传递给蜘蛛,而无需获取网页;
- 默默地丢弃一些请求。
说人话就是:所有的请求与响应都会经过它,我们可以截取并修改成我们需要的形式或功能;
下载器中间件的好处:
- 可以集成Selenium、重试和处理请求异常等
- 我们就是用到了Selenium在中间件中对接scrapy;
selenium在中间件中的使用:
selenium的基本语法:
推荐该网站:http://www.testclass.net/selenium_python
通过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、拉钩等可使用。
注:
- 仅用于技术交流学习,不承担任何责任。