继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

python scrapy框架的基本使用

慕运维2858188
关注TA
已关注
手记 123
粉丝 63
获赞 512
虚拟环境搭建 scrapy安装 新建项目
scrapy startproject MySpider
项目结构 settings.py 文件
BOT_NAME   工程名称

SPIDER_MODULES spider存放的路径 
pipelines.py
数据存储相关
items.py
定义爬取的字段
spider 文件夹
存放spider的文件
生成爬虫模板
scrapy genspider <爬虫名称> <指定域>
pycharm 设置运行环境 pycharm 断点调试 动态获取项目文件夹路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

os.path.abspath(__file__)  : 获取文件的绝对路径地址
os.path.dirname(os.path.abspath(__file__)) : 该文件所在的文件夹,也就是项目文件夹的根目录
sys.path.append(os.path.dirname(os.path.abspath(__file__)))  将项目文件夹放入到python解释器的搜索路径里
脚本文件里执行命令行命令
execute(["scrapy", "crawl", "<爬虫名>"])
setting.py文件中取消robots协议
ROBOTSTXT_OBEY = false
xpath浏览器提取工具
firebug
xpath 基础语法
// 任意位置的所有节点

/  根节点

//@class 所有具有class的属性

p//a p下面任意位置的所有a节点

//p 任意位置所有的p节点

//a[@herf] 

//a[@lang="en"]

//p[last()-1]

//p[last()]

//*

/div/a | //div/p 表示逻辑和

//span[contains(@class,"post")]  包含有其中一个css的类的节点
scrapy的xpath选择器
response.xpath()  返回的结果为  SelectList对象
链式查找
response.xpath().xpath()............
xpath /text() 提取节点里面的字符串
response.xpath("//*[@id='post']/div[1]/h1") :  包含html代码
response.xpath("//*[@id='post']/div[1]/h1/text()")
scrapy shell 调试命令
scrapy shell <url>

图片描述

图片描述

主要作用 : 下载页面调试

正规表达式神器

图片描述
图片描述

Selector对象extract()方法

extract()提取selector对象的data属性的值

![图片描述]

scrapy的css选择器
*  所有节点

#id id 节点

.class 类节点

li a 后代节点

ul + p  ul后面的p

up>p ul里面的第一个p

ul ~ p ul邻居p

a[title]

a[href="baidu.com]

a[href^="http"]

a[href$=",jpg]

a[href*='baidu']  包含baidu字符串的a节点

li:nth-child(3) 第三个li节点

tr:ntth_child(2n) li节点下的偶数tr节点

.a.b  同时包含两个css类的节点 区别于下面
.a .b  
css选择器之伪类选择器
h1::text 用来获取节点内的文本内容
a::attr(herf)  用来获取节点的属性的值 
img::attr(src)
兼容性更好的提取data的方法extract_first()

作用 : 在使用extract()[0]避免抛出数组下标越界异常

源码 :

图片描述

解释:

将 for else 视为[整体],如果 x =[] for x in []: 相当于遍历还没有开始就结束了,程序进入[整体部分]的else阶段,返回 默认值default , 如果 x = [1,2,3] 循环遍历一次就返回结果 ,也就是列表中的第一个值 ,[整体]结束

可以传递默认值参数,作为节点不存在时的默认值

发送url请求的对象

源码:
图片描述

常用:

yield Request(url,callback=self.callback,meta={})  #将请求对象交给scrapy进行下载
从请求里面取出meta里携带的数据
response.get("image","")
进行网址拼接操作的模块
# python3
from urllib import parse
real_url = parse.urljoin(response.url,post_url)
通过三元表达式为数据设定默认值
num = 0 if not match_re else int(match_re.group(1))
图片下载

setting配置:

ITEM_PIPELINES = {
       'scrapy.pipelines.images.ImagesPipeline': 1,
       }

project_dir = os.path.abspath(os.path.dirname(__file__))
IMAGES_URLS_FIELD = 'image_url'     # 传到pipeline时将这个值当数组处理
IMAGES_STORE = os.path.join(project_dir, 'images')
图片url字段的值为什么一定要是可迭代对象
打开App,阅读手记
2人推荐
发表评论
随时随地看视频慕课网APP