Python Scrapy爬虫框架之初次使用
此篇博客为本人对小甲鱼的课程的总结。
关于Scrapy的安装网上都有方法,这里便不再叙述。
使用Scrapy抓取一个网站一共需要四个步骤:
0、创建一个Scrapy项目;
1、定义Item容器;
2、编写爬虫;
3、存储内容。
本次爬取的目标是全球最大的目录网站http://www.dmoztools.net,由于此网站数据过于庞大,我们这里只拿它的两个子网页做测试(手动捂脸)
http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/
http://www.dmoztools.net/Computers/Programming/Languages/Python/Resources/
我们需要爬取的是子网页 http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/ 中的名单、超链接、名单描述。
---
0、创建一个Scrapy项目
首先打开cmd窗口输入以下命令将路径移到桌面(其他位置也可以)
cd desktop
然后创建一个Scrapy项目。继续在命令行中输入以下命令,(命令执行后请暂时不用关闭命令行,等下要用)
scrapy startproject tutorial
(创建一个新的Scrapy项目文件夹,文件夹的名字叫tutorial)文件夹中会有一个scrapy.cfg的配置文件和一个tutorial的子文件夹,tutorial文件夹中有如下内容:
0、__init__.py 这个不用多说,是模块的初始化,不用管
1、items.py 项目的容器
2、pipelines.py
3、settings.py 设置文件
4、spiders/ 文件夹,里面只有一个初始化文件__init__.py ,这里需要我们来完善。
等等文件(可能还有一些其他的文件,这里不多叙述)
1、定义Item容器
item容器是什么呢?item容器是保存爬取到的数据的容器,其使用方法和python字典类似,并且提供了额外的保护机制来避免拼写错误导致的未定义字段错误。
接下来我们要建模。为什么要建模呢?因为item容器是用来存放我们爬取到的网页内容,当爬取的时候返回的是整个网页的内容,而往往我们只是需要其中的一部分内容比如这里的网页 http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/ ,我们只需要他的书名、描述、与超链接。

所以这里我们需要改动item容器,打开 tutorial/item.py ,将其中的TutorialItem模块内容改为以下内容并写好注释:
class TutorialItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field() #标题
link = scrapy.Field() #超链接
desc = scrapy.Field() #描述
保存退出。
2、编写爬虫
接下来是编写爬虫类Spider,Spider是用户编写用于从网站上爬取数据的类。
其包含了一个用于下载的初始URL,然后是如何跟进网页中的链接以及如何分析页面中的内容,还有提取生成item的方法。
接下来我们在Spider文件夹中新建一个叫 dmoz_spider.py 的文件,编写以下代码:(其中name是本次的项目名)
import scrapy class DmozSpider(scrapy.Spider):
name = "dmoz"
#allowed_domains是为了防止在爬取的时候进入了其他网站
allowed_domains = ['dmoztools.net']
#初始爬取位置
star_url = [
'http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/'
'http://www.dmoztools.net/Computers/Programming/Languages/Python/Resources/'
] #定义一个分析方法
def parse(self, response):
filename = response.url.split("/")[-2]
with open(filename, 'wb') as f:
f.write(response,body)
保存关闭。代码解释(解释的不是很好,大概意思理解就行,不喜勿喷):
在本地目录下创建两个文件,叫做Books和Resource,然后将start_url中的两个初始网址提交给Scrapy引擎,Scrapy引擎中有下载器,会将网站的源代码下载过来,然后根据parse方法将下载的内容存放到Books和Resource中。
接下来继续进入刚才的cmd窗口,输入以下命令将路径切换到tutorial文件夹中:
cd tutorial
继续在命令行输入以下命令:
scrapy crawl dmoz
其中crawl是爬取的意思,dmoz是项目名。
然后输入回车执行。成功的话将会出现以下信息:

并且命令执行后在当前目录会生成两个新的文件,叫做Books和Resource。两个文件的内容就是爬取到的网站内容(即网站的源代码)。

3、存储内容
以往我们在爬取网页内容的时候都是使用的html的正则表达式,但是在Scrapy中是使用一种基于Xpath和CSS的表达式机制:Scrapy Selectors
Selectors是一个选择器,它有四个基本的方法:
xpath(): 传入spath表达式,返回该表达式所对应的所有节点的selector list列表
css():传入CSS表达式,返回该表达式所对应的所有节点的selector list列表
extract():序列化该节点为unicode字符串并返回list
re():根据传入的正则表达式对数据进行提取,返回unicode字符串list列表
存储数据之前我们先进去scrapy的shell窗口进行测试。继续对刚才的cmd窗口进行操作,输入以下命令进入shell窗口:
scrapy shell "http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/"
目的是进入该网站的scrapy shell窗口,界面如下:
QQ%7DNTBF.png)
此时我们便可以对他进行操作。
其实这是返回我们刚才的response对象,我们可以对他进行一系列操作,比如response.body命令将会出现该网站的源代码,response.headers命令会出现网站的头配置等等
现在我们列举几个该对象的使用方法:
/html/head/title:选择html文档中<head>标签内的<title>元素;
/html/head/title/text():选择上面提到的<title>元素的文字;
//td:选择所有的<td>元素;
//div[@class='mine']:选择所有具有class='mine'属性的div元素。
此时shell窗口中还有 一个返回对象sel,接下来我们进行查找名单的测试。
输入命令:(以下出现的路径请自行检查网页内容进行查看,右键点击网页对象选择检查即可出现)
sel.xpath('//section/div/div/div/div/a/div/text()').extract()
执行后将会返回网页中的所有名单,图如下:

同样,输入命令以下命令将会返回所有名单的超链接和描述
sel.xpath('//section/div/div/div/div/a/@href').extract() //返回超链接
sel.xpath('//section/div/div/div/div/a/div/text()').extract() //返回名单描述
好,测试完了之后我们来继续编写代码。
现在我们来对爬取内容进行筛选
打开编辑我们刚才编写的 dmoz_spider.py 文件,将内容改为以下内容
import scrapy from tutorial.items import TutorialItem #引入模块 class DmozSpider(scrapy.Spider):
name = "dmoz"
#allowed_domains是为了防止在爬取的时候进入了其他网站
allowed_domains = ['dmoztools.net']
#初始爬取位置
start_urls = [
'http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/',
'http://www.dmoztools.net/Computers/Programming/Languages/Python/Resources/'
] #定义一个分析方法
def parse(self, response):
sel = scrapy.selector.Selector(response) #分析返回的response对象
#//section/div/div/div/div/a/div/text()
sites = sel.xpath('//section/div/div/div/div') #对内容进行筛选
items = []
for site in sites: #对爬取内容进行进一步筛选
item = TutorialItem()
item['title'] = site.xpath('a/div/text()').extract()
item['link'] = site.xpath('a/@href').extract()
item['desc'] = site.xpath('div/text()').extract()
items.append(item) #将筛选后的内容添加到列表items中 return items
保存退出。然后继续在cmd窗口进行操作,首先退出shell窗口:
exit()
随后开始爬取网站内容并将筛选后的数据导出,进行以下命令:
scrapy crawl dmoz -o items.json -t json
-o后面接导出的文件名;-t后面接导出的形式,形式常用的有四种:json、xml、jsonlines以及csv,这里我使用的是json。
执行后在当前路径会产生一个 items.json 的文件,我们使用文本编辑器打开它时会发现,里面就是我们本次要爬取的筛选后的内容:

本次爬取到这里便成功完成!
谢谢观看!(๑•̀ㅂ•́)و✧
我演了很多悲剧,到头来你们都说那是喜剧。 ------------------周星驰
Python Scrapy爬虫框架之初次使用的更多相关文章
- Python Scrapy 爬虫框架实例(一)
之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...
- Python Scrapy 爬虫框架实例
之前有介绍 scrapy 的相关知识,但是没有介绍相关实例,在这里做个小例,供大家参考学习. 注:后续不强调python 版本,默认即为python3.x. 爬取目标 这里简单找一个图片网站,获取图片 ...
- python scrapy爬虫框架概念介绍(个人理解总结为一张图)
python的scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架 python和scrapy的安装就不介绍了,资料很多 这里我个人总结一下,能更加快理解scrapy和快速上手一个简 ...
- [Python] Scrapy爬虫框架入门
说明: 本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息. 项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&st ...
- python - scrapy 爬虫框架(创建, 持久化, 去重, 深度, cookie)
## scrapy 依赖 twisted - twisted 是一个基于事件循环的 异步非阻塞 框架/模块 ## 项目的创建 1. 创建 project scrapy startproject ...
- python - scrapy 爬虫框架 ( 起始url的实现,深度和优先级,下载中间件 )
1. start_urls -- 起始URL 的内部实现(将迭代器转换为生成器) class QSpider(scrapy.Spider): name = 'q' allowed_domains ...
- (1)python Scrapy爬虫框架
部署 1.安装python3.6 64bit 2.下载pywin32 https://sourceforge.net/projects/pywin32/files/pywin32/ 双击安装 3.下 ...
- python scrapy爬虫框架
http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html scrapy 提取html的标签内容 from scrapy.selec ...
- python - scrapy 爬虫框架 ( redis去重 )
1. 使用内置,并加以修改 ( 自定义 redis 存储的 keys ) settings 配置 # ############### scrapy redis连接 ################# ...
随机推荐
- Flutter 底部的renderflex溢出
一开始直接使用Scaffold布局,body:new Column 然后模拟器会提示捕获异常: 然后百度了一下Flutter的溢出问题,发现解决办法是使用SingleChildScrollView包 ...
- webdriervAPI(CSS定位元素)
from selenium import webdriver driver = webdriver.Chorme() driver.get("http://www.baidu.co ...
- java内存回收需要了解的知识
你是否有过这样的经历,跑得好好的Java进程,突然就瘫痪了?多数Java进程瘫痪的原因可以从java虚拟机层面找到原因. 1.什么情况下会执行gc 为了了解我们的系统为什么会不停fgc,我们需要先了解 ...
- 金士顿U盘PS2251-07东芝闪存白片量产CDROM成功教程-群联量产教程-U盘量产网
之前我们发布过金士顿DT100 G3的黑片量产工具教程,因为白片的MPALL量产工具无法量产,所有版本的Phison_MPALL都爆红,最近出了新的白片MPALL V5.03.0A版本,所以试了一下结 ...
- yso中URLDNS的pop链分析(重新分析整理)
#发现之前对这个链关注的点有点问题,重新分析了一下 由于最近面试的过程中被问到了yso中URLDNS这个pop链的工作原理,当时面试因为是谈到shiro的怎么检测和怎么攻击时谈到了这个.其实在实战中用 ...
- 最新 映客java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.映客等10家互联网公司的校招Offer,因为某些自身原因最终选择了映客.6.7月主要是做系统复习.项目复盘.LeetCode ...
- Django模板及表查询笔记
模板层 后端朝html页面传递数据 两种给html页面传递数据的方式 第一种: render(request,'index.html',{'user_list':user_list}) 第二种 ren ...
- [Cometoj#3 B]棋盘_状压dp
棋盘 题目链接:https://cometoj.com/contest/38/problem/B?problem_id=1535 数据范围:略. 题解: 因为行数特别小,所以$dp$的时候可以状压起来 ...
- docker中启动2个mysql实列
一.mac环境安装docker容器 在docker官网中下载docker容器,地址:https://www.docker.com/products/docker-desktop 具体安装教程及设置网络 ...
- POJ 1742 (单调队列优化多重背包+混合背包)
(点击此处查看原题) 题意分析 给你n种不同价值的硬币,价值为val[1],val[2]...val[n],每种价值的硬币有num[1],num[2]...num[n]个,问使用这n种硬币可以凑齐[1 ...