1 切换frame,动作链
2 xpath选择:在xml中查找内容的一门语言
-.
-..
-/
-//
-@
3 自动登录12306
-打码平台使用:别人帮我们破解验证码
-使用selenium点击,滑动
-有的网站会校验是否使用了自动化测试软件:
-window.navigator.webdriver
-获取验证码
-验证码图片的位置和大小
-屏幕截图,pillow抠图
-base64编码,存成图片,前面有标志部分
-base64的解码和编码
4 scrapy
-pip3 install scrapy
-7个组件
-爬虫:spiders文件夹下的一个个py文件,爬取的地址,解析数据
-爬虫中间件:介于爬虫和引擎之间的
-引擎:大总管,负责数据的流动
-调度器:爬取地址的调度和去重
-下载中间件
-下载器:负责下载
-管道:存储,数据清洗
-创建项目,创建爬虫
-scrapy startproject 名字
-scrapy genspider 爬虫名 爬虫地址
-scrapy crawl 爬虫名
-目录结构
-数据解析
-xpath
-拿文本:'.//a/text()'
-拿属性:'.//a/@href'
-css
-拿文本:'a.link-title::text'
-拿属性:'img.image-scale::attr(src)'
-取一条;extract_first()
-取多条:extract()
1 setting中相关配置
1 是否遵循爬虫协议
ROBOTSTXT_OBEY = False
2 请求客户端类型
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
3 日志级别(比--nolog好在,如果出错,控制台会报错)
LOG_LEVEL='ERROR'
2 持久化方案
1 第一种方案,直接存(很少)
-解析函数返回列表套字典
-执行:scrapy crawl cnblogs -o 文件名(json,pkl,csv结尾)
2 第二种:通用方法(pipline)
-1 在items.py中写一个类,继承scrapy.Item
-2 在类中写属性
title = scrapy.Field()
-3 在爬虫中导入类,实例化得到对象,把要保存的数据放到对象中
item['title'] = title
-4 修改配置文件,指定pipline,数字表示优先级,越小越大
ITEM_PIPELINES = {
'crawl_cnblogs.pipelines.CrawlCnblogsPipeline': 300,
}
-5 写一个pipline:CrawlCnblogsPipeline
-open_spider:数据初始化,打开文件,打开数据库链接
-process_item:真正存储的地方
-一定不要忘了return item,交给后续的pipline继续使用
-close_spider:销毁资源,关闭文件,关闭数据库链接
3 全站爬取cnblogs文章(scrapy的请求传参)
3.1 request和response对象传递参数
1 在request对象中
Request(url=url, callback=self.parse_detail,meta={'item':item})
2 在response对象中
item=response.meta['item']
3.2 解析出下一页的地址并继续爬取
next='https://www.cnblogs.com'+response.css('.pager a:last-child::attr(href)').extract_first()
print(next)
4 提高爬取效率
5 爬虫中间件和下载中间件
1 爬虫和下载中间件要使用,需要在配置文件中
SPIDER_MIDDLEWARES = {
'crawl_cnblogs.middlewares.CrawlCnblogsSpiderMiddleware': 5,
}
DOWNLOADER_MIDDLEWARES = {
'crawl_cnblogs.middlewares.CrawlCnblogsDownloaderMiddleware': 5,
}
6 加代理,加cookie,加header,加selenium
0 在下载中间件的process_reqeust方法中
1 加cookie
7 去重规则源码分析
1 使用了集合去重
2 默认使用的去重类:
DUPEFILTER_CLASS = 'scrapy.dupefilters.RFPDupeFilter'
3 后期你可以自己写一个类,替换掉内置的去重
-布隆过滤器:极小内存校验是否重复
-https://www.cnblogs.com/xiaoyuanqujing/protected/articles/11969224.html
4 生成指纹,会把下面两种地址生成一样的指纹(本质是把?后面的参数排序,再生成指纹)
www.baidu.com?name=lqz&age=18
www.baidu.com?age=18&name=lqz
#布隆过滤器
# python中使用
#https://www.lfd.uci.edu/~gohlke/pythonlibs/#bitarray
pip3 install bitarray-xx.whl
pip3 install pybloom_live
from pybloom_live import ScalableBloomFilter
bloom = ScalableBloomFilter(initial_capacity=100, error_rate=0.001, mode=ScalableBloomFilter.LARGE_SET_GROWTH)
url = "www.cnblogs.com"
url2 = "www.liuqingzheng.top"
bloom.add(url)
print(url in bloom)
print(url2 in bloom)
8 scrapy-redis实现分布式爬虫
1 安装scrapy-redis
2 在原来的基础上,爬虫类继承RedisSpider
class CnblogsSpider(RedisSpider):
name = 'cnblogs_redis'
allowed_domains = ['www.cnblogs.com']
redis_key = 'myspider:start_urls'
3 在setting中配置
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 默认就是本地6379
#REDIS_HOST = 'localhost'
#REDIS_PORT = 6379
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
}
4 在多台机器上启动scrapy,向redis中插入起始爬取地址
scrapy crawl cnblogs_redis
redis-cli lpush myspider:start_urls https://www.cnblogs.com/