!@#789#1. 创建项目 scrapy startproject my_project
2.创建spider scrapy genspider my_spider
3.随机User-Agent:
ua 是一个请求头列表
可以放到settings
在下载中间件的process_request()函数里添加 request.headers.setdefault(‘User-Agent’, random.choice(ua_list))
同时把默认的请求头中间件禁掉
‘scrapy.downloadmiddlewares.useragent.UserAgentMiddleware’: None,
4.随机代理
中间件设置:
request.meta[‘proxy’] = proxies
5.随机cookie
中间节设置
request.headers.setdefault(‘Cookie’, cookies)
禁止自带的cookie中间节
‘scrapy.downloadermiddlewares.cookies.CookiesMiddleware’: None,
6. 设置下载超时
DOWNLOAD_TIMEOUT = 15
默认时间超时时间180 秒, 太长这里修改为15秒
可以捕获这个超时错误
from twisted.internet.error import TimeoutError
在 process_exception() 函数里用 isinstance() 判断是否是超时错误
7.设置并发数
CONCURRENT_REQUESTS = 16
默认是16个并发
8. 设置下载延迟
DOWNLOAD_DELAY = 0.5
9.手动处理错误代码
HTTPERROR_ALLOWED_CODES = [403]
一.命令行工具
1.scrapy 的全局命令
startproject # 创建项目
genspider # 创建蜘蛛
settings # 获取settings 的值
runspider # 运行一个蜘蛛文件
shell # 进入交互模式
fetch # 下载给定的url并将内容输出
view # 下载给定的url并保存
version # 查看scrapy 版本号
2. scrapy 仅限项目的命令
crawl # 运行蜘蛛
check # 检测蜘蛛
list # 列出所有蜘蛛
edit # 编辑蜘蛛
parse
bench # 基准测试
3. 创建项目 scrapy startproject myproject [project_dir]
4.创建蜘蛛 scrapy genspider mydomain mydomain.com
5. 查看所有可用命令 scrapy -h
二.蜘蛛
1.name属性
scrapy靠name属性定位和实例化蜘蛛
必须是惟一的
2. allowed_domains
允许爬行的域名
3.custom_settings
字典样式 ,将会覆盖settings里的设置
适用于多个爬虫在同一项目内
4.from_crawl(crawler,* args,** kwargs )
创建蜘蛛的类方法
5.close
类方法, 蜘蛛关闭时调用该方法 并调用spider的 closed()方法
- 在命令行可以通过 -a 来传递参数
三.选择器
1.css
2.xpath
3.re
4.re_first()
可以混合使用
四.itemloader
1.from scrapy.loader import ItemLoader
from myproject.item import Myitem
l = ItemLoader(item=Myitem(), response=response()) # 实例化一个itemloader对象
2.add_path()方法
l.add_xpath(‘name’, xpath1) # name是item字段名 ,xpath1是xpath表达式
3. add_css()方法
l.add_xpath(‘name’, css1) # name是item字段名 ,xpath1是css表达式
4. add_value()方法
l.add_xpath(‘name’, value) # name是item字段名 ,xpath1是具体的值
5.load_item()方法
return l.load_item() # 返回一个item对象
6.
使用add_xpath 或者 add_css 时通常会得到一个列表
要想得到单个数值,或者设置处理函数 要在item中设置
from scrapy.loader.processors import TakeFirst, MapCompose, Join
TakeFirst() 取第一个值
Join() 拼接 可以接受一个字符串
MapCompose() 可以接受一个处理函数
即input_processor参数的效果是在传值给item前进行预处理,并将结果分配给itemloader
output_processor 将itemlaoder中的值处理后分配给item中的字段
还可以通过继承itemloader类来重写itemloader
五.pipline
- process_item(self, item, spider)
每个item都会调用此方法
2.open_spider(self,crawl)
打开蜘蛛时候调用次方法
3.close_spider(self,crawl)
关闭蜘蛛时会调用次方法
4.from_crawler(cls,crawl)
它必须返回管道的新实例。Crawler对象提供对所有Scrapy核心组件的访问
六.request和response
在request中的meta里可以使用 dont_merage_cookies 来不合并cookie
dont_filter 不对url进行去重
request.follow()可以接受相对url
七.
可以使用不同的机制填充设置,每个机制具有不同的优先级。以下是按优先顺序递减的列表:
1.命令行选项(最优先)
2.每蜘蛛的设置
3.项目设置模块
4.每个命令的默认设置
5.默认全局设置(优先级较低)
以下是所有可用Scrapy设置
- BOT_NAME
默认: ‘scrapybot’
此Scrapy项目实现的bot的名称(也称为项目名称)。这将默认用于构建User-Agent,也用于日志记录。
使用该startproject命令创建项目时,它会自动填充项目名称。
- CONCURRENT_ITEMS
默认: 100
在项目处理器(也称为项目管道)中并行处理的最大并发项目数(每个响应)。
- CONCURRENT_REQUESTS
默认: 16
Scrapy下载程序将执行的最大并发(即同时)请求数。
- CONCURRENT_REQUESTS_PER_DOMAIN
默认: 8
将对任何单个域(域名)执行的最大并发(即同时)请求数。
另请参阅:AutoThrottle扩展及其 AUTOTHROTTLE_TARGET_CONCURRENCY选项。
- CONCURRENT_REQUESTS_PER_IP
默认: 0
将对任何单个IP执行的最大并发(即同时)请求数。如果非零,CONCURRENT_REQUESTS_PER_DOMAIN则忽略该 设置,而使用此设置。换句话说,并发限制将应用于每个IP,而不是每个域。
此设置还会影响DOWNLOAD_DELAY和 AutoThrottle扩展:如果CONCURRENT_REQUESTS_PER_IP 非零,