scrapy1.6中文文档
- scrapy1.6中文文档
-
Scrapy框架
- 下载页面
- 解析页面
- 并发
深度
安装
- scrapy学习教程
- 如果安装了anconda,可以在anaconda prompt中使用conda install scrapy
也可以使用pycharm安装
使用
- 指定初始URL
- 解析响应内容
- 给调度器
给item;pipeline用于做格式化;持久化
创建一个初始scrapy初始项目初始工作
① 、在windows终端(cmd)输入,进行前期工作
- scrapy startproject 工程名 >(注意你此时的路径就是你工程所在的路径)
- cd 工程名 (转到你工程所在的文件夹)
- scrapy genspider 爬虫名 要爬的网址 (创建一个爬虫)
- 打开工程文件中的
settings.py
文件 ,进行基本设置
- 令 ROBOTSTXT_OBEY = False (不遵守robot协议,因为如果遵守基本上爬取不到东西)
在Override the default request headers: 中 启动headers 加'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 QIHU 360SE'
②、spiders文件里的编辑
- 打开 爬虫名.py 进行编辑 (编写你的爬虫文件)
- scrapy crawl 爬虫名 (运行爬虫,此时应处于你的工程路径下,如果后面加 "--nolog会只输出结果)
- ==在spider文件的初始处理函数中写入:form scrapy.http import Request , yield Request(url = url,callback = self.parse)== 可以将新要访问的url添加到调度器中,然后调度器进行访问与下载,得到的response交给parse函数处理 (如果要执行深度的话,必须使callback =self.parse 这样才能迭代
- response的方法与属性:
- response.text 返回服务器返回的response(一般为网页源代码)的字符串形式
- response.body 返回服务器返回的response(一般为网页源代码)的字节形式
- response.xpath('str') 以xpath语法定位元素,返回为selector或者selector_lsit对象
- response.meta 返回的是一个字典,其中包含了很多信息,例如 depth
- selector或者seletor_list对象可以使用xpath继续定位元素
- selector_list对象可以迭代
- 通过对selector或者selector_list对象使用extract()等价于getall() 或者 extract_first()等价于get()方法,可以将selector或seletor_list对象中的文本信息提取出来,那个getall()和extract()是生成字符串组成的列表
- 可以通过重写该方法,让访问start_urls中的url的访问返回的response对象调用新的方法(即指定最开始处理请求的方法),即可以将self.parse改成别的
def start_requests(self):
for url in self.start_urls:
yield Request(url,callback=self.parse)
③、items文件中的编辑
通过在items.py文件的XXXXItem类中写入:例如:author =scrapy.Field() ,content =scrapy.Field() 可以将要传给pipelines的数据进行格式化,即用一个XXXItem对象进行封装。然后通过在spider文件初始函数中中写入:from 工程名.items import XXXItem ,item = XXXXItem(author = author,content =content)就可以将数据进行格式化,将author,content封装到item对象中,再通过写yield item 自动将item对象递交给引擎,然后引擎再传给pipelines
④ 、pipelines文件中的编辑
- settings文件中 开启Configure item pipelines 中的那个字典,其中的数字代表了pipelines执行的优先级,你可以在 pipelines文件中定义多个类,通过优先级决定了他们执行的顺序,小的优先。
- 在pipelines中传递的item就是从spider中那边传过来的数据,可以通过
dict(item)
将其变成字典进行储存,也可以用scrapy中内置的类进行存储,见后面;spider指的是spider对象,他有name属性 ,因而可以通过 if spider.name = "XXX"判断是那个蜘蛛爬取的信息,进而有区别的进行处理。 pipeline对象中process_item()方法是当spiders有yield语句 或reurn 数据语句中会执行该方法,open_spider()方法是当爬虫打开后会调用这个函数,close_spider()方法是爬虫完成后会调用该方法。
因而在打开文件的操作可以放在,open_spider()方法中,关闭文件的操作可以放在close_spider()方法中,这样可以防止重复的打开与关闭文件。from_crawler()方法用于创建对象,并获取配置文件中的相关数据。
import json
#from scrapy.exporters import JsonItemExporter
from scrapy.exceptions import DropItem
class QsbkPipeline(object):
# def __init__(self):
# self.fp = open('duanzi.json','w',encoding = 'utf-8')
#
def __init__(self):
'''
进行数据初始化
'''
# self.fp = open('duanzi.json','wb',encoding = 'utf-8') # 这里要用二进制方式打开,因为JsonItemExporter写入文件的形式是二进制形式
# self.exporter = JsonItemExporter(self.fp,ensure_ascii = False,encoding = 'utf-8')
# self.exporter.start_exporting()
pass
@classmethod
def from_crawler(cls,crawler):
'''
创建对象,并获取配置文件(settings)中的相关数据
:param crawler:
:return:
'''
# conn_str = crawler.settings.get("DB") # 获取配置文件(settings文件)中的DB值,
# return cls(conn_str)# 创建对象,并向对对象中传入配置文件中的DB值,可以在__inint__方法中,获取到
def process_item(self, item, spider):
'''
当spiders有yield语句 或reurn 数据语句中会执行该方法
:param item:
:param spider:
:return:
'''
# item_json = json.dumps(dict(item),ensure_ascii = False)
# self.fp.write(item_json+'\n')
# return item
print(item['author']+":"*5+item['content'])
# return item # 当有多个pipeline对象时,这里返回一个item,即可以将item传递给下一个pipeline对象
# raise DropItem() # 若不想将item交给下一个pipeline对象,应该使用这种方式,因为后面有某种方式可以监听
def open_spider(self,spider):
'''
爬虫打开后会调用这个函数
:param spider:
:return:
'''
pass
def close_spider(self,spider):
'''
爬虫完成后会调用这个函数
:param spider:
:return:
'''
pass
scrapy中的自带的去重方法:
输入这个语句即可看到,scrapy中自带类的语句,模范这个类,自定义写一个新的文件,自定义相关方法,即可自定义去重
from scrapy.dupefilters import RFPDupeFilter
自定义去重方法(scrapy中默认是可以在传入调度器中的url去重的)
- 也可以自定义对象,来进行自定义去重 例子:新创建一个含有类RepeatFilter文件,在settings文件中加入以下下配置信息,进行自定义去重类的注册(激活)
DUPEFILTER_CLASS = '工程名.类所在的文件名.RepeatFilter'
类RepeatFilter文件中的代码如下:
# 这个类的名称可以随意定义
class RepeatFilter(object):
def __init__(self):
'''
2、进行对象初始化
'''
self.visited_set = set() #定义一个集合,用来存储非重复地url
@classmethod # 这是一个类方法
def from_settings(cls, settings):
'''
1、创建对象
'''
return cls() #在这里创建了一个实例,因而会去执行__init__()方法
def request_seen(self, request):
'''
4、对象被访问即调用该方法
'''
if request.url in self.visited_set:
return True
self.visited_set.add(request.url)
return False
def open(self): # can return deferred
'''
3、打开蜘蛛,开始爬取
'''
pass
def close(self, reason): # can return a deferred
'''
停止爬取
'''
pass
def log(self, request, spider): # log that a request has been filtered
pass