Scrapy框架的一些学习心得
1 scrapy.cfg的作用
一个项目的配置文件的话在scrapy.cfg里面,里面配置了具体的配置文件所在的路径,以及一些url端口信息,默认的话不需要去修改
2 settings.py的作用
这个的话是具体的配置文件
2.1 爬虫文件的存放路径的话:在下面这里面配置
SPIDER_MODULES = ['itcast.spiders']
NEWSPIDER_MODULE = 'itcast.spiders'
2.2 下面的这个可以配置AGENT 的一些相关
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'itcast (+http://www.yourdomain.com)'
2.3 默认开启的线程数为16,可以在下面的这些代码里面设置
# Configure maximum concurrent requests performed by Scrapy (default: 16)
CONCURRENT_REQUESTS = 32
2.4 默认抓取数据是不等待的,可以在下面设置
# Configure a delay for requests for the same website (default: 0)
# See http://scrapy.readthedocs.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
DOWNLOAD_DELAY = 3
2.5 下面的这个是设置怕从是否遵从某个规定的,最好不要遵循不然的话好多数据会抓不到的
# Obey robots.txt rules
# ROBOTSTXT_OBEY = True
2.6未完待续
3 class Spider(scrapy.Spider)具体的爬虫类解释
3.1 name = ‘xxxx’
这个表示当前的爬虫类的唯一表示,一个项目必须唯一,用来启动爬虫或者其他的时候用到
3.2 allowed_domains = [‘http://www.xxxx.com‘]
这个则表示当前的爬虫会在哪些域名下面抓取数据,如果不在这个域名下面的话那么就不会被抓取数据
3.3 start_urls = [‘http://www.xxxx.com‘]
起始的url地址列表,爬虫执行后第一批请求,将从这个列表获取
3.4 def parse(self, response)
这个方法会在start_urls页面之后被执行,可以在这里面执行相应的解析页面的操作,例如:
nodeList = response.xpath("//div[@class='li_txt']")
# itemList = []
for node in nodeList:
# 创建item字段对象,用来存储信息
item = ItcastItem()
# 下面的返回的是一个xpath对象列表,所以需要使用extract()方法来将其转换成Unicode字符串
name = node.xpath("./h3/text()").extract()
title = node.xpath("./h4/text()").extract()
info = node.xpath("./p/text()").extract()
# 存储到item字段对象里面
item['name'] = name[0]
item['title'] = title[0]
item['info'] = info[0]
# 返回提取的每一个item数据给管道,给管道处理,然后还回来继续执行当前的for循环里面的代码
yield item
上面的代码使用了xpath来解析页面的结构,Scrapy默认支持将数据以4中形式输出,可以通过
scrapy crawl “爬虫唯一表示名称” -o itcast.json
scrapy crawl “爬虫唯一表示名称” -o itcast.csv
还两个忘掉了,大概语法就是这样的
还可以直接将item返回给相应的管道处理,使用下面的这个代码实现
yield item
注意如果要返回给管道的话需要在settings.py文件里面将管道的配置开启
4 管道相关
4.1 pipelines.py文件的一些方法释义
def process_item(self, item, spider):
return item
默认的只有上面这一个方法的,这个方法是用来处理爬虫类里面传递来的item的,可以在里面定义自己的处理逻辑,注意下需要代码最后必须return item,item在管道里面处理完毕之后需要再传递给引擎,return item就是将处理好的item传递给引擎的,如果不 return item的话那么就会在这里中断掉,那么就会出错,再就是如果存在多个管道类的话那么return item就表示将item接着传递给下一个管道,执行那个管道的业务逻辑
再就是参数列表里面的spider就是表示传递item过来的spider对象,可以通过.name等方法查看spider的名字等信息
def __init__(self):
可以在默认的方法之外添加这个初始化方法,这个方法的话初始化一些需要初始化的东西
def close_spider(self, spider):
还可以添加这个方法,这个方法可以算是一个结束方法,里面的话可以执行一些关闭某些流等操作,类似的数据库的关闭等可以在这个方法里面执行
4.2 自定义管道的配置
可以在settings.py里面设置自定义的管道
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'itcast.pipelines.ItcastPipeline': 300,
}
ITEM_PIPELINES这个是一个字典,可以在里面添加自定义的管道,其中itcast表示项目名,pipelines这个表示具体的文件,ItcastPipeline表示具体的管道类,后面的300则表示有限制,范围在0-1000,值越小优先级越高
item会顺序的经过所有的管道类,然后全部经过后下一个item进来,接着进入全部的管道
5 Selectors选择器的
Selectorts有四个基本的方法,最常用的就是xpath:
xpath():传入xpath表达式,返回该列表所对应的所有节点的selectors list列表
extract():序列化该节点为Unicode字符串并返回list
css():传入css表达式,返回该表达式所对应的所有节点的selector list列表,语法同BeautifulSoup4
re():根据传入的正则表达式对数据进行提取,返回Unicode字符串list列表
6 各个文件的作用
1 爬虫文件请求是发送请求,处理响应的
2 item文件是定义字段的
3 管道文件的话是进一步处理item的
7 scrapy框架的执行顺序
1 首先执行爬虫文件,爬虫文件会根据start_urls的地址发送请求,然后得到响应
2 会执行parse方法,然后我们可以通过xpath或者正则等处理,然后存放到item中
3 可以同过yield来将item返回给管道,给管道进一步处理,如果存在多个管道的话那么这个item就会根据settings.py文件里面定义的优先级来顺序执行,直到执行完毕全部的管道
4 有下一个item的话那么久执行下一个item
5 没有的话那么就会返回给引擎
8 爬取图片注意
1 爬虫类的话需要将得到的网页地址存放在item中
2 管道类需要继承ImagesPipeline类(需要导入),然后重写get_media_requests方法,类似下面这样
def get_media_requests(self, item, info):
imageLink = item["imageLink"]
yield scrapy.Request(imageLink)
3 再就是需要在配置文件中配置图片的存放路径代码季下面的IMAGES_STORE部分,如果爬取的页面为手机端的页面的话那么需要设置下USER_AGENT,如下面这样,下面的这个为iphone的USER_AGENT例子
IMAGES_STORE = "/Users/yedeguo/Desktop/斗鱼图片"
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML,' \
' like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25'