scrapy爬虫流程及各个部件作用
Scrapy入门
1.创建一个scrapy项目
scrapy startproject mySpider
2.生成一个爬虫
scrapy genspider example “example.com”
3.提取数据
完善spider,使用xpath等方法
4.保存数据
pipeline中保存数据
pipeline的使用
在pipelines.py 文件的process_item函数中实现存储方法
在settings.py 文件中取消ITEM_PIPELINES的注释来开启部件 (位置:权重)

从pipeline的字典形式可以看出来,pipeline可以有多个,而且确实能定义多个。
原因:
- 可能会有多个spider,不同的pipeline处理不同的item的内容
- 一个spider的内容可能要做不同的操作,比如存入不同的数据库中
注意:
- pipeline的权重越小优先级越高
- pipeline中process_item方法名不能修改为其它名称
怎么在pipeline处理中区分数据来源:
- 在获取数据时加入键值,来标记数据来源
- 通过process_item函数中的spider参数来区分
- 使用log,见下面log的使用
# 在获取数据时加入键值方法
class MyspiderPipeline(object):
# 在这个函数中实现存储方法
def process_item(self, item, spider):
if item["come_from"] == "itcast":
pass
return item
# 通过process_item函数中的spider参数来区分
class MyspiderPipeline(object):
# 在这个函数中实现存储方法
def process_item(self, item, spider):
if spider.name == 'itcast':
pass
return item
存入mongodb数据库
from pymongo import MongoClient
client = MongoClient()
collection = client["itcast"]['teacher']
class MyspiderPipeline(object):
# 在这个函数中实现存储方法
def process_item(self, item, spider):
if spider.name == 'itcast':
collection.insert(item)
return item
open_spider和close_spider
前者在爬虫开启的时候执行,仅执行一次;后者在爬虫关闭的时候执行,仅执行一次
使用情景:开启数据库连接,关闭数据库连接
示例:在open_spider函数中添加属性后可以在其它类里引用
# Pipeline中定义属性
def open_spider(self,spider):
spider.hello = "hello"
# 爬虫中使用
print(self.hello)
log的使用
在代码运行结果中输出warning或更高级内容
在settings.py 文件中添加 日志等级
# 设置日志等级
LOG_LEVEL = “WARNGING”
将log日志保存到本地
在settings.py 文件中添加 文件位置
注意:添加文件位置后代码运行结果中不再显示log信息
# 设置日志保存位置
LOG_FILE = “./log.log”
logging模块的使用
在日志中显示日志来源
import logging
# 实例化logger
logger = logging.getLogger(__name__)
# 在想要输出日志的位置
logger.warning(item)
设置日志的输出样式
参考网上进行设置
# 设置日志的输出样式
logging.basicConfig()
在其它文件中调用
# 引入其它文件中logger的样式
from log_style import logger
logger.warning(content)
实现翻页请求
next_url = response.xpath('//a[@id="next"]/@href').extract_first()
if next_url:
yield scrapy.Request(
next_url,
callback=self.parse
)
设置User-agent
# 在settings.py中取消USER_AGENT的注释,并将后面字符串改为新的User-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
scrapy.Request 说明
meta参数使用示例:
if next_url:
yield scrapy.Request(
next_url,
callback=self.parse1,
meta={"item":item}
)
def parse1(self,response):
response.meta["item"]
items.py的使用
注意:如果同时使用mongodb数据库需要在写入数据时将item转换为字典
# items.py
class MyspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
name = scrapy.Field()
title = scrapy.Field()
# spiders 构造数据
for li in li_list:
item = MyspiderItem()
item['name'] = li.xpath(".//h3/text()").extract_first()
item['title'] = li.xpath(".//h4/text()").extract_first()
logger.warning(item)
yield item
Github项目:爬取阳光热线问政平台
debug信息
Scrapy shell的使用
Scrapy shell是一个交互终端,可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath表达式
使用方法:
scrapy shell url
- response.url:当前响应的url地址
- response.request.url:当前响应对应的请求的url地址
- response.headers:响应头
- response.body:响应体,就是html代码,默认是bytes类型
- response.requests.headers:当前响应的请求头
settings.py文件中定义变量并在其它文件中使用
- from settings import 变量名
- 调用响应的.settings[变量名]或.settings.get(变量名,None)
携带cookies模拟登录
class ItcastSpider(scrapy.Spider): name = 'itcast' # 爬虫名 allowed_domains = ['itcast.cn'] # 允许爬取的范围 start_urls = ['http://www.itcast.cn/channel/teacher.shtml'] # 最开# 始请求的url地址 # 设置cookies 字典类型 cookies = {} # 重写start_requests函数 def start_requests(self): yield scrapy.Request(url=self.start_urls,callback=self.parse,cookies=self.cookies) # 查看cookies是否传递 # 在settings中添加该参数 # COOKIES_DEBUG = True