scrapy入门(一)文件介绍与配置
Terminal命令
创建爬虫项目
scrapy startproject spider_project_name #自定义项目名
spiders文件夹中创建爬虫源文件, 也是爬虫主要功能实现的部分
cd spider_project_name #进入项目 scrapy genspider spider_name www.baidu.com #spider_name 新建的爬虫名 #www.baidu.com 域名 #规则爬虫:scrapy genspider -t crawl xxx(爬虫名) xxx.com (爬取域)
运行命令:scrapy crawl spider_name或scrapy crawl xxx -o xxx.json
各文件配置及其作用
settings 文件(项目的配置文件)
需要修改的地方有:
- 19行 : USER_AGENT
- 修改robots协议为ROBOTSTXT_OBEY = False
- 添加控制输出日志的语句 : LOG_LEVEL = 'ERROR' 和LOG_FILE = 'log.txt'
- 67行取消注释, 启用管道存储 ITEM_PIPELINES
items文件, 其中item对象用来保存数据的
需要在item文件中定义属性
例如爬取某直播平台的各个主播的标题, 主播名, 人气
title = scrapy.Field() author = scrapy.Field() hot = scrapy.Field()
pipelines文件
文件格式和内容基本固定, 除了原本的一个管道类之外, 还可以自己添加, 但是内部函数名称固定,不可修改class spider_project_namePipeline(object): fp = None def open_spider(self, spider): print('我只会在爬虫开始的时候执行一次') self.fp = open('./data.txt', 'w', encoding='utf-8') def process_item(self, item, spider): # # 读取item对象中的content # title = item['title'] # author = item['author'] # hot = item['hot'] # 该函数每次只能接受一个item对象,不用with...open防止打开文件多次 self.fp.write(item['title'] + ':' + item['author'] + ':' + item['hot'] + '\n') return item def close_spider(self, spider): self.fp.close() print('我只会在爬虫开始的时候执行一次')
核心spider_name文件
一般需要注释掉allowed_domains
start_urls表示爬取的开始页面
parse函数里面是xpath解析
def parse(self, response): # xpath解析所要爬取的元素 #1.以爬取王者荣耀主播信息为例,单个主播的信息为//*[@id="js-live-list/li[1]"],去掉li后面的[1],则可以代表同一级的所以元素,也就是所有主播的信息,以列表的形式返回 li_list = response.xpath('//*[@id="js-live-list"]/li') #2.for循环遍历,可以再用定位器定位具体的元素信息,需要注意的是,parse()函数里面必须要加.extract()来获取文本内容 #li.xpath('./a[2]/text()').extract_first()等价于li.xpath('./a[2]/text()')[0].extract() for li in li_list: title = li.xpath('./a[2]/text()').extract_first() author = li.xpath('./span/span[1]/i/text()').extract_first() hot = li.xpath('./span/span[2]/i[2]/text()').extract_first()
spider_name第二部分:保存文件
# 新建一个item对象,用于管道存储,后面写的都是为了存储 item = SecondtestItem() #给对象属性赋值,似乎是因为对象调用属性不能直接用".",所以用['属性'] item['hot'] = hot item['author'] = author item['title'] = title # 将item对象提交给管道,管道中的process_item负责接收item对象 yield item