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 = falsexpath浏览器提取工具
firebugxpath 基础语法
// 任意位置的所有节点 / 根节点 //@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
主要作用 : 下载页面调试
正规表达式神器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 .bcss选择器之伪类选择器
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字段的值为什么一定要是可迭代对象