[Python] Scrapy爬虫框架入门
说明:
本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息。
项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&start=
开发环境:win10、Python3.5、Scrapy1.5
一、安装
》pip install scrapy
//如果安装不成功,可以参考 https://blog.csdn.net/dapenghehe/article/details/51548079
//或下载安装twisted
二、创建项目(scrapy startproject)
1、在开始爬取之前,必须创建一个新的Scrapy项目。进入相应目录,运行下列命令(tencent为项目名称):
》scrapy startproject tencentSpider
2、进入项目目录(tencentSpider)
项目目录结构如下:

scrapy.cfg:项目的配置文件。
tencentSpider/:项目的Python模块,将会从这里引用代码。
tencentSpider/spiders/:存储爬虫代码目录(爬虫文件主要在此编辑)。
tencentSpider/items.py:项目的目标文件。
tencentSpider/middlewares.py:项目中间件。
tencentSpider/pipelines.py:项目管道文件。
tencentSpider/setting:项目的设置文件。
到此,项目基本创建完成,接下来就是编写爬虫代码了。
三、明确目标(tencentSpider/items.py)
明确需要爬取的网址以及需要的信息,在 items.py 中定义需要爬取的信息字段。
本项目主要爬取:https://hr.tencent.com/position.php?&start= 网站里的职称、详情地址、类别、人数、地点和发布时间。
1、打开 tencentSpider 目录下的 items.py。
2、Item 定义结构化数据字段,用来保存爬取到的数据,类似于Python的字典,但是提供一些额外的的保护减少错误。
3、可以通过创建一个 scrapy.Item 类,并且定义类型为 scrapy.Field 的类属性来定义一个Item(可以理解成类似于ORM的映射关系)。
4、接下来,创建一个 TencentspiderItem 类,和构建item模型(model)。
items.py代码如下:
# -*- coding: utf-8 -*- # Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html import scrapy class TencentspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field() # 职称
title = scrapy.Field()
# 详情地址
link = scrapy.Field()
# 类别
cate = scrapy.Field()
# 人数
num = scrapy.Field()
# 地点
address = scrapy.Field()
# 发布时间
date = scrapy.Field()
四、制作爬虫(spiders/tencentSpider.py)
1、爬取数据
① 在 与 scrapy.cfg 同级目录下执行如下命令,将会在 tencentSpider/spiders 目录下创建一个名为 tencent 的爬虫,并制定爬取的域范围(或手动创建文件,基本代码格式如下所示):
》scrapy genspider tencent "hr.tencent.com"
② 打开 tencentSpider/spiders 目录下的 tencent.py ,默认的代码如下:
# -*- coding: utf-8 -*-
import scrapy class TencentSpider(scrapy.Spider):
name = 'tencent'
allowed_domains = ['hr.tencent.com']
start_urls = ['http://hr.tencent.com/'] def parse(self, response):
pass
③ 编写爬虫文件,基本思路:构造分页url,解析内容(xpath),管道文件处理:
# -*- coding: utf-8 -*-
import scrapy
from tencentSpider.items import TencentspiderItem class TencentSpider(scrapy.Spider):
# 爬虫的名字
name = 'tencent'
allowed_domains = ["hr.tencent.com"] # 拼接 URL
url = "https://hr.tencent.com/position.php?&start="
offset = 0 # 首次爬取入口URL
start_urls = [url + str(offset)] def parse(self, response):
info_ls = response.xpath('//tr[contains(@class, "odd")] | //tr[contains(@class, "even")]') # 原始地址
origin_url = "https://hr.tencent.com/" for each in info_ls:
# 初始化模型对象
item = TencentspiderItem() # 职称
title = each.xpath("./td/a/text()")[0].extract()
# 详情地址
link = origin_url + each.xpath("./td/a/@href")[0].extract()
# 职位分类
cate = each.xpath('./td[2]/text()')[0].extract()
# 人数
num = each.xpath('./td[3]/text()')[0].extract()
# 所在地址
address = each.xpath('./td[4]/text()')[0].extract()
# 发布时间
date = each.xpath('./td[5]/text()')[0].extract() item['title'] = title
item['link'] = link
item['cate'] = cate
item['num'] = num
item['address'] = address
item['date'] = date # 交给管道 pipelines 处理
yield item # 循环遍历分页,这里只爬取 100 条
if self.offset < 100:
self.offset += 10 # 每次处理完一页的数据之后, 重新发送下一页的页面请求
yield scrapy.Request(self.url + str(self.offset), callback=self.parse)
else:
print("[ALL_END:爬虫结束]")
④ 修改配置文件(settings.py),部分:
需要修改的主要有如下三处:
# 是否遵守 robot 协议,本项目为False
ROBOTSTXT_OBEY = False # 请求头
DEFAULT_REQUEST_HEADERS = {
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Window NT 6.1; Trident/5.0;)',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
# 'Accept-Language': 'en',
} # 配置管道文件
ITEM_PIPELINES = {
'tencentSpider.pipelines.TencentspiderPipeline': 300,
}
⑤ 编写管道文件 pipelines.py:
这里的管道文件主要把数据以json格式保存在文件中:
# -*- coding: utf-8 -*- # Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import json class TencentspiderPipeline(object):
def __init__(self):
self.save_path = open("res_info.json", "w", encoding="utf8")
self.save_path.write("[") def process_item(self, item, spider):
# 处理每页的数据,并写入文件
json_text = json.dumps(dict(item), ensure_ascii=False) + ", \n"
self.save_path.write(json_text) return item def close_spider(self, spider):
self.save_path.write("{}]")
self.save_path.close()
⑥ 运行爬虫:
》scrapy crawl tencent
⑦ 查看结果,打开数据文件 res_info.json:

[Python] Scrapy爬虫框架入门的更多相关文章
- 【python】Scrapy爬虫框架入门
说明: 本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息. 项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&st ...
- Python之Scrapy爬虫框架 入门实例(一)
一.开发环境 1.安装 scrapy 2.安装 python2.7 3.安装编辑器 PyCharm 二.创建scrapy项目pachong 1.在命令行输入命令:scrapy startproject ...
- Scrapy 爬虫框架入门案例详解
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:崔庆才 Scrapy入门 本篇会通过介绍一个简单的项目,走一遍Scrapy抓取流程,通过这个过程,可以对 ...
- Python Scrapy 爬虫框架实例(一)
之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...
- Python Scrapy 爬虫框架实例
之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...
- scrapy爬虫框架入门实例(一)
流程分析 抓取内容(百度贴吧:网络爬虫吧) 页面: http://tieba.baidu.com/f?kw=%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB&ie=ut ...
- scrapy爬虫框架入门教程
scrapy安装请参考:安装指南. 我们将使用开放目录项目(dmoz)作为抓取的例子. 这篇入门教程将引导你完成如下任务: 创建一个新的Scrapy项目 定义提取的Item 写一个Spider用来爬行 ...
- python scrapy爬虫框架概念介绍(个人理解总结为一张图)
python的scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架 python和scrapy的安装就不介绍了,资料很多 这里我个人总结一下,能更加快理解scrapy和快速上手一个简 ...
- python - scrapy 爬虫框架(创建, 持久化, 去重, 深度, cookie)
## scrapy 依赖 twisted - twisted 是一个基于事件循环的 异步非阻塞 框架/模块 ## 项目的创建 1. 创建 project scrapy startproject ...
随机推荐
- FTP文件传输服务器原理
FTP服务器,全称File Transfer Protocol Server,是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务.FTP,文件传输协议(File Transfer ...
- luogu题解 P5022 【旅行】
本人的代码可以说洛谷最简单的了 我的存图方式有些与众不同 a[5000][5000]中第一个下标表示第几个点,第二个表示与点相连的点 虽然比前向星废内存但时间极快,大概是O(n)的. 现在步入正题 6 ...
- json与js对象间的转化
- jquery3和layui冲突导,致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
项目中使用的jquery版本是jquery-3.2.1,在使用layui弹出全屏iframe窗口时,iframe窗口顶部总是出现一个152px高的滚动窗口无法实现真正全屏,代码如下: <!DOC ...
- 原创:用node.js搭建本地服务模拟接口访问实现数据模拟
前端开发中,数据模拟是必要的,这样就能等后台接口写完,我们直接把接口请求的url地址从本地数据模拟url换成后台真实地址就完成项目了.传参之类的都不用动. 之前网上找了很多类似于mock等感觉都不太实 ...
- python 感悟
* 优美胜于丑陋.* 显式胜于隐式.* 简单胜于复杂.* 复杂胜于难懂.* 扁平胜于嵌套.* 稀疏胜于紧密.* 可读性应当被重视.* 尽管实用性会打败纯粹性,特例也不能凌驾于规则之上.* 不要忽略任何 ...
- GitHub 用户排行榜
排行榜预览网址:Github | Githack | UNPKG | Gitee Github 中国用户排名,全球仓库 Star 最多排名,通过 Github API v3 来生成页面数据,排行榜预览 ...
- 雪花算法【分布式ID问题】【刘新宇】
分布式ID 1 方案选择 UUID UUID是通用唯一识别码(Universally Unique Identifier)的缩写,开放软件基金会(OSF)规范定义了包括网卡MAC地址.时间戳.名字空间 ...
- Kubernetes容器集群管理环境 - 完整部署(中篇)
接着Kubernetes容器集群管理环境 - 完整部署(上篇)继续往下部署: 八.部署master节点master节点的kube-apiserver.kube-scheduler 和 kube-con ...
- Netty源码分析-- ThreadLocal分析(九)
为了更好地探讨Netty的内存模型,后面会用到,这里我还是决定跟大家一起看下ThreadLocal和FastThreadLocal的源码,有的时候我们在看源码的时候会一层层的遇到很多之前没有看过的内容 ...