python scrapy框架介绍及爬取腾讯招聘

python爬虫中有一个非常强大的框架'scrapy框架',这个框架还是非常好用的,只不过里边的东西还是非常多的,这里只介绍了一小部分!

安装scrapy框架

Ubuntu安装: sudo pip3 install Scrapy
如果安装错误则需要添加一些依赖包
1、sudo apt-get install libffi-dev
2、sudo apt-get install libssl-dev
3、sudo apt-get install libxml2-dev
4、sudo apt-get install python3-dev
5、sudo apt-get install libxslt1-dev
6、sudo apt-get install zlib1g-dev
7、sudo pip3 install -I -U service_identity

Windows安装

cmd命令行(管理员): python -m pip install Scrapy

Scrapy框架有五大组件

引擎(Scrapy)
用来处理整个系统的数据流处理,触发事务,它是整个框架的核心
调度器(Schedule)
用来接受引擎发过来的请求,压入队列,由它来决定下一个爬取的URL地址,在分布式爬取中,同时去除重复的URL
下载器(Downloader)
顾名思义,用来下载网页的内容,并将网页的内容返回给Spider文件
爬虫(Spider)
爬虫文件,从网页获取自己所需要的item和下一级URL页面
项目管道(Item Pipeline)
主要是持久化item
下载器中间件(Downloader Middlewares)
包装请求(随机代理等)
蜘蛛中间件(Spider Middlewares)
爬虫文件,可修改响应对象属性

scrapy爬虫工作流程
首先由引擎爬虫程序索要第一个要爬取的URL,交给调度器去入队列-->调度器处理请求后出队列,通过下载器中间件交给下载器去下载-->下载器得到响应对象后,通过蜘蛛中间件交给爬虫程序-->爬虫程序进行数据提取-->数据交给管道文件取入库处理,对于需要跟进的URL,再次交给调度器入队列,依次循环!

开始创建一个爬虫项目
1.命令:
scrapy startproject 项目名
2.创建爬虫文件
scrapy genspider 爬虫名 域名
3.运行爬虫
scrapy crawl 爬虫名
爬取腾讯招聘的网站发现这是一个动态的网站,那动态的网站就不可以用正则或者xpath来匹配了,来看一下解析过程:
进入到腾讯招聘首页按F12进入到抓包,这是一级界面,异步请求,复制Request URL到网页中打开,发现这里有我们所需要的各种信息,这是一级页面,用同样的方式我们进入二级页面,二级页面中才是真正想要抓取的东西,那在一级界面中需要获取到所需要的POST_ID
这是抓取二级页面的信息重要的东西.
在这里插入图片描述
二级页面请求包
在这里插入图片描述
在这里可以看到是一段json格式的文本
进入到爬虫文件,这里需要注意一点的是allowed_admains是一定不能写错的,不知道就去网站复制,如果错误就抓不到任何的东西,程序也不会报错,还有就是start_urls这个是起始页,也就是所爬取的第一页的url,这里没有重写parses方法,这里需要注意一点,这里提一点,注意start_urls这里一定要写对,起初我在写完代码,运行的时候没有报错,也没有抓取到任何信息,来看一下!
在这里插入图片描述
在这里插入图片描述
这里说spider文件打开,但是INFO:说爬取0页,后边就说spider 关闭,中间没有任何输出,当然页不会持久化写入.
接下来是爬虫文件,提取到一级界面的URL地址在parse中控制爬去的页数,并将拿到的一级页面URL交给调度器,调度器交给下载器,下载器在交给爬虫文件处理,这样我们就获取到了一级页面,在parse_one函数中,我们提取了职业名称,类型,和POST_ID,拿到POST_ID后,拼接二级页面的地址,然后再交给调度器,在交给下载器,再到爬虫文件,获取到所需要的信息,这里是动态的请求,我们解析出来是一个json的文本,就需要我们用json.loads函数对获取的response转换。最后一定要yield item 每调用一次就返回一次item 在parse_one中交给调度器的时候我们传递了一个mate参数,这个参数的作用的是传递给下一个函数,使用过程可以理解为把需要传递的信息赋值给这个meta的变量,meta参数只接受字典类型,所以把传递的信息改成‘字典’的形式!在交给调度器,下载器,返回给爬虫文件,在parse_two中取出即可。

# -*- coding: utf-8 -*-
import scrapy
import json
from ..items import TencentItem

class TencentSpider(scrapy.Spider):
    name = 'tencent'
    allowed_domains = ['careers.tencent.com']
    one_url = 'https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1563912271089&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex={}&pageSize=10&language=zh-cn&area=cn'
    two_url = 'https://careers.tencent.com/tencentcareer/api/post/ByPostId?' \
              'timestamp=1563912374645&postId={}&language=zh-cn'
    start_urls=[one_url.format(1)]
    def parse(self, response):
        for page_index in range(1,5):
            print(page_index)
            url = self.one_url.format(page_index)
            yield scrapy.Request(
                url = url,
                callback = self.parse_one
            )

    def parse_one(self,response):
        html = json.loads(response.text)
        print(html)
        for job in html['Data']['Posts']:
            item = TencentItem()
            # 职位名称
            item['zh_name'] = job['RecruitPostName']
            item['zh_type'] = job['CategoryName']
            # postId: 拼接二级页面的地址
            post_id = job['PostId']
            two_url = self.two_url.format(post_id)
            # 交给调度器
            yield scrapy.Request(
                url = two_url,
                meta = {'item':item},
                callback = self.parse_two
            )

    def parse_two(self,response):
        item = response.meta['item']
        html = json.loads(response.text)
        # 职责
        item['zh_duty'] = html['Data']['Responsibility']
        # 要求
        item['zh_require'] = html['Data']['Requirement']

        yield item

爬虫在爬取数据后保存及后期处理就交给pipelines管道来实现。这里就是实现数据持久化!

class TencentPipeline(object):
    def process_item(self, item, spider):
        print(dict(item))
        return item

import pymysql
class TencentMysqlPipeline(object):
    def open_spider(self,spider):
        self.db = pymysql.connect(
            '127.0.0.1','root','123456','tencentdb',
            charset='utf8'
        )
        self.cursor = self.db.cursor()

    def process_item(self,item,spider):
        ins = 'insert into tencenttab values(%s,%s,%s,%s)'
        job_list = [
            item['zh_name'],item['zh_type'],item['zh_duty'],
            item['zh_require']
        ]
        self.cursor.execute(ins,job_list)
        self.db.commit()
        return item

    def close_spider(self,spider):
        self.cursor.close()
        self.db.close()

它的作用主要是用来处理获取的的数据,做数据清洗用的,这里我们只获取一些数据!

import scrapy

class TencentItem(scrapy.Item):
    # define the fields for your item here like:
    zh_name = scrapy.Field()
    # 类别
    zh_type = scrapy.Field()
    # 职责
    zh_duty = scrapy.Field()
    # 要求
    zh_require = scrapy.Field()

接下来就是设置settings文件
在这里插入图片描述
先看一下第一个参数ROBOTSTXT_OBEY=False 这就是是否遵循robotstxt协议 这里将它设置为False
CONCURRENT_REQUESTS=10 这就是设置并发请求最大数
DOWNLOAD_DELAY 设置访问等待时间

在这里插入图片描述
在这里插入图片描述ITEM_PIPELINES
打开DEFAULT_REQUEST_HEADERS和ITEM_PIPELINES设置User-Agent和添加持久化数据的管道,并将权重设置为200.权重越小优先级越高!
这里一个爬虫框架就搭建完成了,接下来就直接运行爬虫文件就可以了 在终端中进入文件输入scrapy crawl tencent 终端就会显示爬去到的数据,完成后在数据库中查看数据就完成了
scrapy框架里边还有很多东西,这个框架处理爬虫文件还是非常有效的,这里只介绍了一小部分!

发布了14 篇原创文章 · 获赞 6 · 访问量 980

猜你喜欢

转载自blog.csdn.net/weixin_44935235/article/details/97954372