为了账号安全,请及时绑定邮箱和手机立即绑定

python scrapy框架的基本使用

标签:
Python
虚拟环境搭建 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字段的值为什么一定要是可迭代对象
点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消