python网络爬虫--项目实战--scrapy爬取前程无忧招聘信息(4)

一、目标

爬取该网站的招聘信息

二、网站分析:

首先用xpath规则匹配页面的元素匹配不到,由此初步得出该页面是动态加载的。然后在页面源码中发现要找的数据在一个js中,故最终得出该页面是动态加载的

三、完整代码:

a51job.py

import json

import scrapy

from LearnScrapy1.items import CompanyItem, JobDescItem


class A51jobSpider(scrapy.Spider):
    name = '51job'
    allowed_domains = ['search.51job.com']
    start_urls = [
        'https://search.51job.com/list/010000,000000,0000,00,9,99,python,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0']
    base_urls = 'https://search.51job.com/list/010000,000000,0000,00,9,99,python,2,%d.html?lang=c&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0'

    def parse(self, response):
        # print(response)
        # print(response.text)
        js = response.xpath('//script[contains(@type,"text/javascript") and not(@src)]').extract_first()
        r = js.split("__SEARCH_RESULT__")[1][3:-9]
        d = json.loads(r)
        companies = d.get("engine_search_result")
        for company in companies:
            company_item = CompanyItem()
            company_item["company_name"] = company.get("company_name")
            company_item["job_name"] = company.get("job_name")
            company_item["provide_salary_text"] = company.get("providesalary_text")
            company_item["job_href"] = company.get("job_href")
            company_item["work_area_text"] = company.get("workarea_text")

            yield company_item

            yield scrapy.Request(url=company.get("job_href"), callback=self.parse_job_detail, dont_filter=True)

        current_page = int(d.get('curr_page'))

        if current_page == 1:
            total_page = int(d.get('total_page'))

            for i in range(2, total_page):
                yield scrapy.Request(url=self.base_urls % i, callback=self.parse, dont_filter=True)

    def parse_job_detail(self, response):
        result = response.xpath('//div[contains(@class,"bmsg job_msg inbox")]/p/text()').extract() or response.xpath(
            "//div[contains(@class, 'bmsg job_msg inbox')]/div/span/text()").extract()
        print(result)
        job = JobDescItem()
        job["content"] = ";".join(result)
        yield job

pipelines.py

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
import MySQLdb
from itemadapter import ItemAdapter

from LearnScrapy1.items import CompanyItem, JobDescItem


class Learnscrapy1Pipeline:

    def open_spider(self,spider):

        conn = MySQLdb.Connect(host='localhost',user='root',password='6666',port=3306,database='job',charset='utf8')
        self.conn = conn
        self.cursor = conn.cursor()

    def close_spider(self,spider):

        self.conn.close()

    def process_item(self, item, spider):


        if isinstance(item,CompanyItem):
            # print(item.get('company_name'))
            # print(item.get('provide_salary_text'))
            # print(item.get('job_href'))
            # print(item.get('work_area_text'))
            # print(item.get('job_name'))


            self.cursor.execute("insert into company(company_name,job_href,company_addr,salary,job_name) values('%s',"
                                "'%s','%s','%s','%s');" % (item.get("company_name"),item.get("job_href"),item.get("work_area_text"),
                                                           item.get("provide_salary_text"),item.get("job_name")))
            self.conn.commit()

        if isinstance(item,JobDescItem):
            self.cursor.execute("insert into job_desc(content) values('%s');" % item.get("content"))
            self.conn.commit()

        return item

items.py

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.html

import scrapy


class Learnscrapy1Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    pass


class CompanyItem(scrapy.Item):
    company_name = scrapy.Field()
    provide_salary_text = scrapy.Field()
    job_href = scrapy.Field()
    work_area_text = scrapy.Field()
    job_name = scrapy.Field()

class JobDescItem(scrapy.Item):
    content = scrapy.Field()
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,scrapy是一个强大的Python爬虫框架,可以用来爬取各种网站数据。以下是爬取前程无忧岗位的基本步骤: 1. 创建一个Scrapy项目 在终端中使用以下命令创建一个Scrapy项目: ``` scrapy startproject jobspider ``` 这将创建一个名为`jobspider`的Scrapy项目。 2. 创建一个Spider 使用以下命令在项目中创建一个Spider: ``` scrapy genspider jobspider spidername ``` 其中,`jobspider`是Spider所属的项目名称,`spidername`是Spider的名称。 3. 定义Spider 在Spider的Python文件中,定义`start_urls`属性和`parse`方法。`start_urls`属性是一个列表,包含要爬取的页面URL。`parse`方法是一个回调函数,用于处理爬取到的响应数据。 以下是一个简单的Spider定义: ``` import scrapy class JobSpider(scrapy.Spider): name = "jobspider" start_urls = [ 'https://search.51job.com/list/000000,000000,0000,00,9,99,Python,2,1.html', ] def parse(self, response): for job in response.css('div.el'): yield { 'title': job.css('p.t1 span a::text').get(), 'company': job.css('span.t2 a::text').get(), 'location': job.css('span.t3::text').get(), 'salary': job.css('span.t4::text').get(), } next_page = response.css('div.p_in ul li.bk a::attr(href)').get() if next_page is not None: yield response.follow(next_page, self.parse) ``` 这个Spider将爬取前程无忧Python相关的岗位信息,并提取岗位标题、公司名称、工作地点和薪资信息。 4. 运行Spider 在终端中使用以下命令运行Spider: ``` scrapy crawl spidername -o output.json ``` 其中,`spidername`是Spider的名称,`output.json`是将结果保存到的文件名。爬虫运行完成后,结果将保存到指定的JSON文件中。 以上就是使用Scrapy爬取前程无忧岗位的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值