热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

scrapymysql实例,8.Scrapy爬虫案例实战Python全栈

任务:爬取腾讯网中关于指定条件的所有社会招聘信息,搜索条件为北京地区,Python关键字的就业岗位,并将信息存储到MySql数据库中。实现

任务:爬取腾讯网中关于指定条件的所有社会招聘信息,搜索条件为北京地区,Python关键字的就业岗位,并将信息存储到MySql数据库中。

实现思路:首先爬取每页的招聘信息列表,再爬取对应的招聘详情信息

① 创建项目

在命令行编写下面命令,创建项目tencent

scrapy startproject tencent

项目目录结构:

tencent

├── tencent

│ ├── __init__.py

│ ├── __pycache__

│ ├── items.py # Items的定义,定义抓取的数据结构

│ ├── middlewares.py # 定义Spider和DownLoader的Middlewares中间件实现。

│ ├── pipelines.py # 它定义Item Pipeline的实现,即定义数据管道

│ ├── settings.py # 它定义项目的全局配置

│ └── spiders # 其中包含一个个Spider的实现,每个Spider都有一个文件

│ ├── __init__.py

│ └── __pycache__

└── scrapy.cfg #Scrapy部署时的配置文件,定义了配置文件路径、部署相关信息等内容

② 进入tencent项目目录,创建爬虫spider类文件(hr招聘信息)

执行genspider命令,第一个参数是Spider的名称,第二个参数是网站域名。

scrapy genspider hr hr.tencent.com

$ tree

├── tencent

│ ├── __init__.py

│ ├── __pycache__

│ │ ├── __init__.cpython-36.pyc

│ │ └── settings.cpython-36.pyc

│ ├── items.py

│ ├── middlewares.py

│ ├── pipelines.py

│ ├── settings.py

│ └── spiders

│ ├── __init__.py

│ ├── __pycache__

│ │ └── __init__.cpython-36.pyc

│ └── hr.py #在spiders目录下有了一个爬虫类文件hr.py

└── scrapy.cfg

# hr.py的文件代码如下:

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

import scrapy

class HrSpider(scrapy.Spider):

name = 'hr'

allowed_domains = ['hr.tencent.com']

start_urls = ['https://hr.tencent.com/position.php?keywords=python&lid=2156']

def parse(self, response):

#解析当前招聘列表信息的url地址:

detail_urls = response.css('tr.even a::attr(href),tr.odd a::attr(href)').extract()

#遍历url地址

for url in detail_urls:

#fullurl = 'http://hr.tencent.com/' + url

#构建绝对的url地址,效果同上(域名加相对地址)

fullurl = response.urljoin(url)

print(fullurl)

测试一下获取第一页的招聘详情url地址信息

③ 创建Item

Item是保存爬取数据的容器,它的使用方法和字典类型,但相比字典多了些保护机制。

创建Item需要继承scrapy.Item类,并且定义类型为scrapy.Field的字段:

职位id号,名称、位置、类别、要求、人数、工作职责、工作要求

具体代码如下:(创建一个类名为HrItem)

import scrapy

class TencentItem(scrapy.Item):

# define the fields for your item here like:

# name = scrapy.Field()

pass

class HrItem(scrapy.Item):

'''

人事招聘信息封装类

(职位id号,名称、位置、类别、要求、人数、职责和要求)

'''

table = "hr" #表名

id = scrapy.Field()

title = scrapy.Field()

location = scrapy.Field()

type = scrapy.Field()

number = scrapy.Field()

duty = scrapy.Field()

requirement = scrapy.Field()

④ 解析Response

在hr.py文件中,parse()方法的参数response是start_urls里面的链接爬取后的结果。

提取的方式可以是CSS选择器、XPath选择器或者是re正则表达式。

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

import scrapy

from tencent.items import HrItem

class HrSpider(scrapy.Spider):

name = 'hr'

allowed_domains = ['hr.tencent.com']

start_urls = ['https://hr.tencent.com/position.php?keywords=python&lid=2156']

def parse(self, response):

#解析当前招聘列表信息的url地址:

detail_urls = response.css('tr.even a::attr(href),tr.odd a::attr(href)').extract()

#遍历url地址

for url in detail_urls:

#fullurl = 'http://hr.tencent.com/' + url

#构建绝对的url地址,效果同上(域名加相对地址)

fullurl = response.urljoin(url)

#print(fullurl)

# 构造请求准备爬取招聘详情信息,并指定由parse_page()方法解析回调函数

yield scrapy.Request(url=fullurl,callback=self.parse_page)

#获取下一页的url地址

next_url = response.css("#next::attr(href)").extract_first()

#判断若不是最后一页

if next_url != "Javascript:;":

url = response.urljoin(next_url)

#构造下一页招聘列表信息的爬取

yield scrapy.Request(url=url,callback=self.parse)

# 解析详情页

def parse_page(self,response):

#构造招聘信息的Item容器对象

item = HrItem()

# 解析id号信息,并封装到Item中

item["id"] = response.selector.re_first('οnclick="applyPosition\(([0-9]+)\);"')

#标题

item["title"] = response.css('#sharetitle::text').extract_first()

#位置

item["location"] = response.selector.re_first('工作地点:(.*?)')

#类别

item["type"] = response.selector.re_first('职位类别:(.*?)')

#人数

item["number"] = response.selector.re_first('招聘人数:([0-9]+)人')

#工作职责

duty = response.xpath('//table//tr[3]//li/text()').extract()

item["duty"] = ''.join(duty)

#工作要求

requirement = response.xpath('//table//tr[4]//li/text()').extract()

item["requirement"] = ''.join(requirement)

#print(item)

#交给管道文件

yield item

⑤、创建数据库和表:

在mysql中创建数据库mydb和数据表hr

CREATE TABLE `hr` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`title` varchar(255) DEFAULT NULL,

`location` varchar(32) DEFAULT NULL,

`type` varchar(32) DEFAULT NULL,

`number` varchar(32) DEFAULT NULL,

`duty` text DEFAULT NULL,

`requirement` text DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

⑥、使用Item Pipeline

在Item管道文件中,定义一个MysqlPipeline,负责连接数据库并执行信息写入操作

import pymysql

class TencentPipeline(object):

def process_item(self, item, spider):

return item

class MysqlPipeline(object):

def __init__(self,host,user,password,database,port):

self.host = host

self.user = user

self.password = password

self.database = database

self.port = port

@classmethod

def from_crawler(cls,crawler):

return cls(

host = crawler.settings.get("MYSQL_HOST"),

user = crawler.settings.get("MYSQL_USER"),

password = crawler.settings.get("MYSQL_PASS"),

database = crawler.settings.get("MYSQL_DATABASE"),

port = crawler.settings.get("MYSQL_PORT"),

)

def open_spider(self, spider):

'''负责连接数据库'''

self.db = pymysql.connect(self.host,self.user,self.password,self.database,charset="utf8",port=self.port)

self.cursor = self.db.cursor()

def process_item(self, item, spider):

'''执行数据表的写入操作'''

#组装sql语句

data = dict(item)

keys = ','.join(data.keys())

values=','.join(['%s']*len(data))

sql = "insert into %s(%s) values(%s)"%(item.table,keys,values)

#指定参数,并执行sql添加

self.cursor.execute(sql,tuple(data.values()))

#事务提交

self.db.commit()

return item

def close_spider(self, spider):

'''关闭连接数据库'''

self.db.close()

⑦ 修改配置文件

打开配置文件:settings.py 开启并配置ITEM_PIPELINES信息,配置数据库连接信息

当有CONCURRENT_REQUESTS,没有DOWNLOAD_DELAY 时,服务器会在同一时间收到大量的请求。

当有CONCURRENT_REQUESTS,有DOWNLOAD_DELAY 时,服务器不会在同一时间收到大量的请求。

# 忽略爬虫协议

ROBOTSTXT_OBEY = False

# 并发量

CONCURRENT_REQUESTS = 1

#下载延迟

DOWNLOAD_DELAY = 0

ITEM_PIPELINES = {

#'educsdn.pipelines.EducsdnPipeline': 300,

'educsdn.pipelines.MysqlPipeline': 301,

}

MYSQL_HOST = 'localhost'

MYSQL_DATABASE = 'mydb'

MYSQL_USER = 'root'

MYSQL_PASS = ''

MYSQL_PORT = 3306

⑧、运行爬取:

执行如下命令来启用数据爬取

scrapy crawl hr



推荐阅读
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 如何在PHP中获取数组中特定元素的索引位置
    在PHP中获取数组中特定元素的索引位置有多种方法。首先,可以使用 `array_search()` 函数,其语法为 `array_search(目标值, $array)`,该函数将返回匹配元素的第一个键名(即下标)。其次,也可以利用 `array_keys()` 函数,通过 `array_keys($array, 目标值)` 语法来获取所有匹配元素的键名列表。这两种方法都能有效解决数组元素定位的问题,具体选择取决于实际需求和性能考虑。 ... [详细]
  • 本项目通过Python编程实现了一个简单的汇率转换器v1.02。主要内容包括:1. Python的基本语法元素:(1)缩进:用于表示代码的层次结构,是Python中定义程序框架的唯一方式;(2)注释:提供开发者说明信息,不参与实际运行,通常每个代码块添加一个注释;(3)常量和变量:用于存储和操作数据,是程序执行过程中的重要组成部分。此外,项目还涉及了函数定义、用户输入处理和异常捕获等高级特性,以确保程序的健壮性和易用性。 ... [详细]
  • 浏览器作为我们日常不可或缺的软件工具,其背后的运作机制却鲜为人知。本文将深入探讨浏览器内核及其版本的演变历程,帮助读者更好地理解这一关键技术组件,揭示其内部运作的奥秘。 ... [详细]
  • PHP 各版本对比:标准版与最新顶级版的详细分析 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • ### 摘要`mkdir` 命令用于在指定位置创建新的目录。其基本格式为 `mkdir [选项] 目录名称`。通过该命令,用户可以在文件系统中创建一个或多个以指定名称命名的文件夹。执行此操作的用户需要具备相应的权限。此外,`mkdir` 还支持多种选项,如 `-p` 用于递归创建多级目录,确保路径中的所有层级都存在。掌握这些基本用法和选项,有助于提高在 Linux 系统中的文件管理效率。 ... [详细]
  • 利用 Zend Framework 实现高效邮件发送功能 ... [详细]
  • DRF框架中Serializer反序列化验证机制详解:深入探讨Validators的应用与优化
    在DRF框架的反序列化验证机制中,除了基本的字段类型和长度校验外,还常常需要进行更为复杂的条件限制校验。通过引入`validators`模块,可以实现自定义校验逻辑,如唯一字段校验等。本文将详细探讨`validators`的使用方法及其优化策略,帮助开发者更好地理解和应用这一重要功能。 ... [详细]
  • 优化后的标题:利用 jQuery 实现高效树形结构元素选择与操作
    在Web前端开发中,DOM结构本质上是一种树形结构。通过优化后的jQuery选择器,可以高效地选择和操作DOM树中的节点。这些选择器不仅简化了代码编写,还提高了性能和可维护性。本文将详细介绍如何利用jQuery的树形选择器实现高效的元素选择与操作。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
author-avatar
手机用户2502920591_700
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有