4python全栈之路系列之scrapy爬虫s

简介:

python全栈之路系列之scrapy爬虫


An open source and collaborative framework for extracting the data you need from websites.

官网:https://scrapy.org
GITHUB地址:https://github.com/scrapy/scrapy

Scrapy运行流程大概如下:

  1. 引擎从调度器中取出一个链接(URL)用于接下来的抓取

  2. 引擎把URL封装成一个请求(Request)传给下载器

  3. 下载器把资源下载下来,并封装成应答包(Response)

  4. 爬虫解析Response

  5. 解析出实体(Item),则交给实体管道进行进一步的处理

  6. 解析出的是链接(URL),则把URL交给调度器等待抓取


安装

因为我是Ubuntu系统,所以可以直接通过pip安装scrapy

pip install scrapy

yum install gcc gcc-c++ python-devel mysql-devel zlib-devel openssl-devel -y

pip install twisted==13.1.0()

安装时候报错,需要安装着两项低版本的twisted

使用

创建项目

scrapy startproject xiaohuar

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   tree xiaohuawang 
xiaohuawang
# 项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
├── scrapy.cfg
└── xiaohuawang
     ├── __init__.py
     # 设置数据存储模板,用于结构化数据
     ├── items.py
     # 数据处理行为,如:一般结构化的数据持久化
     ├── pipelines.py
     ├── __pycache__
     # 配置文件,如:递归的层数、并发数,延迟下载等
     ├── settings.py
     # 爬虫目录,如:创建文件,编写爬虫规则
     └── spiders
         ├── __init__.py
         └── __pycache__
         
4  directories,  6  files

编写爬虫

创建文件:”xiaohuar/xiaohuar/spiders/myspider.py”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import  scrapy
 
class  XiaoHuarSpider(scrapy.spiders.Spider):
     name  =  "xiaohuar"   # APP的名字,必须定义
     start_urls  =  [
         "http://www.xiaohuar.com/hua/" ,   # 起始URL
         
     ]
     
     def  parse( self , response):   # 抓取start_urls页面,自动执行parse回调函数
         current_url  =  response.url   # 当前请求的URL
         body  =  response.body   # 请求的内容
         unicode_body  =  response.body_as_unicode()   # 编码
         print (body)

运行

进入xiaohuar目录,运行命令

1
scrapy runspider myspider.py  - - nolog   # 不输出debug日志

一个抓取图片的小实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import  scrapy
import  os
import  urllib
from  scrapy.selector  import  HtmlXPathSelector
 
class  XiaoHuarSpider(scrapy.spiders.Spider):
     name  =  "xiaohuar"   # APP的名字,必须定义
     start_urls  =  [
         "http://www.xiaohuar.com/hua/" ,   # 起始URL
     ]
     
     def  parse( self , response):   # 抓取start_urls页面,自动执行parse回调函数
         hxs  =  HtmlXPathSelector(response)   # 匹配查找
         items  =  hxs.select( '//div[@class="item_list infinite_scroll"]/div' )
         for  in  range ( len (items)):
             srcs  =  hxs.select(
                 '//div[@class="item_list infinite_scroll"]/div[%d]//div[@class="img"]/a/img/@src'  %  i).extract()
             names  =  hxs.select(
                 '//div[@class="item_list infinite_scroll"]/div[%d]//div[@class="img"]/span/text()'  %  i).extract()
             schools  =  hxs.select(
                 '//div[@class="item_list infinite_scroll"]/div[%d]//div[@class="img"]/div[@class="btns"]/a/text()'  %  i).extract()
             if  srcs  and  names  and  schools:
                 # print(names, srcs, schools)
                 # ['覃罗莹'] ['/d/file/20161018/5385b7113046ac9ae560da41a44b12af.jpg'] ['广西农业职业技术学院']
                 try :
                     ab_src  =  "http://www.xiaohuar.com"  +  srcs[ 0 ]   # 文件路径
                     file_name  =  names[ 0 +  "."  +  srcs[ 0 ].split( "." )[ - 1 ]   # 保存的文件名
                     file_path  =  os.path.join( "./pic" , file_name)   # 保存的路径当前目录pic
                     # print(ab_src, file_name, file_path)
                     # http://www.xiaohuar.com/d/file/20161018/5385b7113046ac9ae560da41a44b12af.jpg 覃罗莹jpg ./pic/覃罗莹jpg
                     
                     urllib.urlretrieve(ab_src, file_path)   # 下载文件
                     # urllib.request.urlretrieve(ab_src, file_path)  # 下载文件python3 是这个语法
                    
                 except  Exception as e:
                     print ( "错误》》" , e)

选择器

基本的选择器

选择器 描述
// 子子孙孙
/ 孩子
//div[@class="c1"][@id='i1'] 属性选择器
//div//img/@src div下所有的img属性src
//div//a[1] 索引取值
//div//a[1]//text() 索引取值的内容

通过extract获取真实的数据:

1
/ / div[@ class = "c1" ][@ id = 'i1' ].extract()

支持正则

选择器 描述
//.select("div//a[1]").re("昵称:(\w+)") 正则

官方文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/selectors.html

两种查找方式

1
2
3
4
5
6
7
8
9
# 即将被废弃的
from  scrapy.selector  import  HtmlXPathSelector
hxs  =  HtmlXPathSelector(response)
items_HtmlXPathSelector  =  hxs.select( '//div[@class="item_list infinite_scroll"]/div' )
print ( len (items_HtmlXPathSelector))
 
from  scrapy.selector  import  Selector
items_Selector  =  Selector(response = response).xpath( '//div[@class="item_list infinite_scroll"]/div' )
print ( len (items_Selector))

正则表达式实例

1
2
3
4
5
<body>
     <li  class = "item-" ><a href = "link.html" >first item< / a>< / li>
     <li  class = "item-0" ><a href = "link1.html" >first item< / a>< / li>
     <li  class = "item-1" ><a href = "link2.html" >second item< / a>< / li>
< / body>
1
2
3
ret  =  Selector(response = response).xpath( '//li[re:test(@class, "item-\d*")]//@href' ).extract()
# re -- 通过正则进行匹配
# test -- 匹配

扩展

重复的URL不访问

先把长的URL进行MD5加密,加密成32或者64位,可以保存在一个集合或者缓存、数据库中,每次抓取之前都先判断有没有这个URL。

递归查找

wKioL1kAVYrwxjRtAAD1bp2fSAM896.png

设置查找深度:修改settings.py配置文件,加入以下参数指定深度DEPTH_LIMIT = 1

内容格式化

就是相当于分类,比如说下面的文件:

文件 功能
myspider.py 查找URL的规则
items.py 数据
pipelines.py 数据持久化

如图所示:

wKiom1kAVWKw0BbqAABNjhu75cQ704.png










本文转自 Edenwy  51CTO博客,原文链接:http://blog.51cto.com/edeny/1919716,如需转载请自行联系原作者
目录
相关文章
|
15天前
|
数据采集 Python
【python】爬虫-西安医学院-校长信箱
本文以西安医学院-校长信箱为基础来展示爬虫案例。来介绍python爬虫。
【python】爬虫-西安医学院-校长信箱
|
1月前
|
数据采集 Python
爬虫实战-Python爬取百度当天热搜内容
爬虫实战-Python爬取百度当天热搜内容
66 0
|
1月前
|
数据采集 存储 XML
深入浅出:基于Python的网络数据爬虫开发指南
【2月更文挑战第23天】 在数字时代,数据已成为新的石油。企业和个人都寻求通过各种手段获取互联网上的宝贵信息。本文将深入探讨网络爬虫的构建与优化,一种自动化工具,用于从网页上抓取并提取大量数据。我们将重点介绍Python语言中的相关库和技术,以及如何高效、合法地收集网络数据。文章不仅为初学者提供入门指导,也为有经验的开发者提供进阶技巧,确保读者能够在遵守网络伦理和法规的前提下,充分利用网络数据资源。
|
21天前
|
数据采集 安全 Python
python并发编程:Python实现生产者消费者爬虫
python并发编程:Python实现生产者消费者爬虫
24 0
python并发编程:Python实现生产者消费者爬虫
|
1月前
|
数据采集 数据挖掘 调度
异步爬虫实践攻略:利用Python Aiohttp框架实现高效数据抓取
本文介绍了如何使用Python的Aiohttp框架构建异步爬虫,以提升数据抓取效率。异步爬虫利用异步IO和协程技术,在等待响应时执行其他任务,提高效率。Aiohttp是一个高效的异步HTTP客户端/服务器框架,适合构建此类爬虫。文中还展示了如何通过代理访问HTTPS网页的示例代码,并以爬取微信公众号文章为例,说明了实际应用中的步骤。
|
1天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
6 0
|
4天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
13天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
15天前
|
数据采集 存储 前端开发
Python爬虫如何快速入门
写了几篇网络爬虫的博文后,有网友留言问Python爬虫如何入门?今天就来了解一下什么是爬虫,如何快速的上手Python爬虫。
18 0
|
29天前
|
数据采集 存储 Web App开发
一键实现数据采集和存储:Python爬虫、Pandas和Excel的应用技巧
一键实现数据采集和存储:Python爬虫、Pandas和Excel的应用技巧