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
来源:https://www.cnblogs.com/yimeisuren/p/12405288.html