虚拟环境搭建
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
主要作用 : 下载页面调试
正规表达式神器
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字段的值为什么一定要是可迭代对象