scrapy框架学习
一、创建scrapy项目
scrapy startproject [项目名称]
scrapy startproject test0409
二、创建爬虫Spider(Ps: 在创建的项目下面创建spider cd test0409
)
1、继承scrapy.Spider类
scrapy genspider [爬虫名] [域名]
scrapy genspider tieba tieba.baidu.com
1、
scrapy.Resquest(url [, callback, method=‘GET’, headers, body, cookies, meta, dont_filter=Flase])
callback:指定传入的url交给哪个解析函数去处理
meta:实现在不同的解析函数之间进行数据的传递
dont_filter=Flase:默认Flase, url会经过allow_domain过滤。
yield scrapy.Request(
self.start_urls[0],
callback=self.parse,
cookies= cookies,
)
2、POST表单提交
yield scrapy.FormRequest.form_response(
response, # 自动从该响应中找到form表单进行登陆
formdata={"email": "####", "password":"####"},
callback=self.***, # 后续处理函数
)
2、继承CrawlSpider类
scrapy genspider -t crawl [爬虫名] [域名]
scrapy genspider -t crawl tieba2 tieba.baidu.com
注意
rules = (
# 使用正则匹配
# Rule(
LinkExtractor(allow=r'Items/'),
callback='parse_item',
follow=True
),
# 使用xpath匹配
# Rule(
LinkExtractor(restrict_xpaths=("//div/ul/li", )),
callback='parse_item',
follow=True
),
)
目录结构如下:
一个项目中可创建多个爬虫
三、爬虫内的信息传递
创建item,自动传递至items.py中
items.py
其中可以定义类型scrapy.Field字段
name = scrapy.Field()
在spider中实例化
form [项目名].items import [项目名]Item
item = [项目名]Item()
实例化一个自定义的item(操作和字典一致)
pipelines.py
实现数据的存储
四、启动爬虫(在项目下启动)
scrpay crawl [爬虫名]
scrpay crawl tieba
settings配置文件的相关
项目自带
BOT_NAME = 'myscrapy'
SPIDER_MODULES = ['myscrapy.spiders']
NEWSPIDER_MODULE = 'myscrapy.spiders'
日志提醒
如果想自定义log格式:网上百度
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(filename)s[line:%(lineno)d] %(message)s',datefmt='%Y-%m-%d')
logger = logging.getLogger(__name__)
"""
使用日志提醒
"""
LOG_LEVEL = "WARNING" # 去除日志提醒
LOG_FILE = "./log.log" # 日志保存在本地
robots协议
"""
是否遵守robots协议
"""
ROBOTSTXT_OBEY = False
"""
Cookies
需要携带cookies访问的,可以重写start_requests(self) 函数,指定start_urls的处理方式
使用Cookies之前,别忘了settings
"""
#COOKIES_ENABLED = False # 默认开启
COOKIES_DEBUG = True
下载中间件middlewares
"""
# 下载中间件 手动开启
"""
DOWNLOADER_MIDDLEWARES = {
'myscrapy.middlewares.MyscrapyDownloaderMiddleware': 543, # 管道:权重,权重越小优先级越高
}
middlewares.py
1、当每个request通过下载中间件时,该方法被调用。不return。(添加自定义的UA和代理)
def process_request(self, request, spider):
pass
2、当下载器完成http请求,传递响应给引擎使用的时候调用
def process_response(self, request, response, spider):
return response
item_pipelines 通道
"""
打开item_pipelines 通道
"""
ITEM_PIPELINES = {
'myscrapy.pipelines.MyscrapyPipeline': 300,
}
USER_AGENT
"""
设置USER_AGENT, 也可以使用最下方的USER_AGENTS_LIST
"""
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'myscrapy (+http://www.yourdomain.com)'
USER_AGENT='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'