01
2017年11月8日
9:53
1.robot协议:规定搜索引擎能爬取的站点和数据
网站域名.robot.txt
2.HTTPS比HTTP更安全,但性能更低
HTTP
超文本传输协议
默认端口号:80
HTTPS
HTTP + SSL(安全套接字层)
默认端口号:443
3.url的格式:
形式 scheme://host[:port#]/path/…/[?query-string][#anchor]
scheme:协议(例如:http, https, ftp)
host:服务器的IP地址或者域名
port:服务器的端口(如果是走协议默认端口,80 or 443)
path:访问资源的路径
query-string:参数,发送给http服务器的数据,参数使用&隔开
anchor:锚(跳转到网页的指定锚点位置,不会跳转或刷新页面)
4.爬虫需要通过伪装请求头来伪装成浏览器访问
5.HTTP响应头
Last-Modified:网站最后更新时间(主要用于增量式爬虫)
GET方法
6.HTTP请求报文的格式
7.HTTP常见请求头
8.GET方法和POST方法的区别
9.bytes是Python 3中特有的,Python 2 里不区分bytes和str。
python3中:
str 使用encode方法转化为 bytes
bytes通过decode转化为str
10.requests库
作用:发送网络请求,返回响应数据
优势:
requests的底层实现就是urllib2
requests在python2 和python3中通用,方法完全一样
requests简单易用
requests能够自动帮助我们解压(gzip压缩的等)网页内容
方法和属性:
GET请求:request.get(url, headers=…, params=…)
params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
headers的形式:字典,模拟浏览器,欺骗服务器,获取和浏览器一致的内容
requests.text: 返回的是str格式的响应内容
respones.content: 返回的bytes字节流的响应内容
response.url :查看完整url地址
response.encoding :查看响应头部字符编码
response.status_code :查看响应码
response.request.headers: 获取请求头
response.headers : 获取响应头
11.response.text 和response.content的区别
response.text
类型:str
解码类型: 根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
如何修改编码方式:response.encoding=”gbk”
response.content
类型:bytes
解码类型: 没有指定
如何修改编码方式:response.content.deocde(“utf8”)
更推荐使用response.content.deocde()的方式获取响应的html页面
12.sys.argv
Sys.argv其实就是一个序列,里边的项为用户输入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该将程序保存了,从外部来运行程序并给出参数
import sys
a=sys.argv[0]
print(a)
a=sys.argv[1]
13.在windows下面编写python脚本,编码问题:
Python UnicodeEncodeError: ‘gbk’ codec can’t encode character 解决方法
在windows下面,新文件的默认编码是gbk
f = open(“out.html”,”w”,encoding=’utf-8’)
14.上下文管理器 with
with open(‘file.txt’, ‘w’) as f :
f.write(‘…….’)
15.发送POST请求
需要构造发送的数据
使用Json库,解析Json数据,转换成Python字典
import Json
dict = json.loads(requests.context)
16.使用代理
17.cookie和session
客户端禁用了Cookie,session数据会存放在URL中
使用cookies(登录)
(1)在headers中添加cookie:
headers = {
‘User’:’…’,
‘Cookie’:’…’
}
(2)构造cookies:
将cookie转换为字典,传入requests.get()中
验证是否使用cookie登录成功
查看url和状态码
使用session(保持状态)
构造session对象
18.requests
(1)requests.utils工具
(2)关闭SSL认证,verify
requests.get(url, verify=false)
(3)添加超时,timeout
默认为3分钟
requests.get(url, timeout=10)
21.抓包工具
Fiddler
谷歌调试
NetWork
02
2017年11月8日
9:53
1.数据提取
数据分类:
结构化数据:
json、xml
非结构化数据
html
2.数据转换:
json—->python字典
json.loads(data)
python字典—->json
json.dumps(j_data)
3.
4.post的使用场景:
表单登录
api接口
5.使用代理的格式
普通代理:’http’: ‘http://ip:port‘
私密代理:’http’: ‘http://user:pwd@ip:port‘
6.从列表中随机获取一个:
random.choice(list)
7.正则表达式
. 匹配除\n之外的所有
. 在DOTALL或S模式可以匹配所有字符(包括换行)
re.findall(‘a.b’,data, re.DOTALL)
re.compile(正则,re.S)
特殊字符需要 \ 转义
贪婪模式:在数量词后面添加?
findall返回一个列表
正则中的单个分组()返回一个数据(字符串)
多个分组()返回一个元组
8.xpath
zip
os.sep 跨平台路径解析
xpath返回的是一个列表
9.使用比较low的浏览器请求头
10.strip去掉换行
11.多线程爬虫:
(1).创建url、response、data的队列
(2).
设置守护线程,跟随主线程的退出而退出
t.setDaemon(True)
主线程设置监听队列状态
03
2017年11月12日
10:16
1.
2.xpath不能识别table中的tbody,跳过即可
3.需要渲染的地方使用selenium
4.Tesseract
Tesseract是一个将图像翻译成文字的OCR库(光学文字识别,Optical Character Recognition)
04-scrapy
2017年11月14日
9:05
1.Scrapy框架的优点
提供了整套项目的打包方案,开发速度快
使用scrapy框架开发的项目,稳定性极高
crapy框架的底层实现非常优秀,性能优越
使用scrapy框架实现分布式爬虫简单
2.windows下需要搭建scrapy环境
https://zhuanlan.zhihu.com/p/24982105
3.scrapy运行机制
Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.
Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests
4.scrapy框架使用流程
(1)创建项目:scrapy startproject name
(2)明确目标
操作: 分析目标站点,在items文件中进行对应建模
原因: 模板实例存储数据比字典更安全
(3)创建爬虫:
scrapy genspider name xxx.com
(4)运行爬虫:
scrapy crawl name
(5)shell调试:
scrapy shell
可在shell中查看响应和请求、调试xpath
5.yied让函数暂停,下次调用继续执行
6.字符串的常用操作:
去掉空格、空行: str.strip()
分割为列表:srt.split(“/“)
替换:str.replace(“\xa0”, “”)
列表各项拼接:””.join(str)
混合使用:’’.join([i.strip() for i in movie.xpath(‘./div[2]/p[1]/text()’).extract()]).replace(‘\xa0’,’’)
xpath爬取所有子孙节点的文字
bloger = selector.xpath(“//a[@class=’author-name blue-link’]”)
print bloger[0].xpath(‘string(.)’).strip()
05-scrapy
2017年11月15日
21:06
1.增量爬虫使用head请求,scrapy自身不带head请求,可配合requests库
2.请求
1)GET请求
Request类
重要参数:
url 目标url
callback 目标url响应的的解析函数
meta 传参
headers 请求头,模拟伪装
dont_filter 该请求是否被调度器过滤
cookies cookies参数
meta: 比较常用,在不同的请求之间传递数据使用的。字典dict型,如:
def parse(self, response):
# 发送
yield scrapy.Request(item[‘link’],callback=self.parse_detail,meta={“chuanzhi”:item})
def parse_detail(self, response):
# 接收
item = response.meta[‘chuanzhi’]
2)POST请求
FormRequest类和FormRequest.from_response(自动获取表单并将表单数据提交)
参数:
同Request
formdata 表单参数(字典格式)
作用范围:
模拟登陆
发送post数据获取响应
scrapy默认发送get请求,如果希望程序执行一开始就发送POST请求,可以重写Spider类的start_requests(self) 方法
如:
def start_requests(self):
url = self.start_urls
# FormRequest 是Scrapy发送POST请求的方法
yield scrapy.FormRequest(
url = url,
formdata = {“email” : “xx@xx.com”, “password” : “xxx”},
callback = self.parse_page
)
def parse(self, response):
# do something
使用FormRequest.from_response则不用传url,传入当前response即可
yield scrapy.FormRequest.from_response(response,formdata=post_data,callback=self.parse)
3.Crawlspider类
CrawlSpider类定义了一些规则(rule)来提供跟进link的方便机制
自动提取链接并提交请求、爬取的网页中获取link并继续爬取
1)导包
①导入链接提取器
from scrapy.linkextractors import LinkExtractor
②导入crawlspider类和Rule
from scrapy.spiders import CrawlSpider,Rule
2)创建CrawlSpider爬虫文件
scrapy genspider -t crawl
3)使用rules来提取符合正则的链接
rules = (
Rule(LinkExtractor(allow=r’start=\d+’), callback=’parse_item’, follow=True),
)
4)另创方法,不能重写parse方法
4.CrawlSpider与Spider的区别
1)自动提取链接,并做成请求,发送给引擎
①rules变量存放Rule对象的实例
②Rule实例是提取链接并对其进行后续处理的规则
③连接提取器是必须的,可以单独使用
④连接提取器提取的相对url会被自动补全
5.回调函数使用字符串
2)不能重写parse方法(原因:CrawlSpider类在parse方法中实现了自身逻辑)
①重写了parse_start_url方法处理起始url对应的响应
②parse_start_url默认返回数据或请求的列表
5. CrawlSpider类的优缺点
1)优点:
适合整站爬取
爬取效率高
2)缺点:
难以通过meta进行参数传递
6.数据入库
scrapy如何使用mongodb数据
1).将数据库的参数写在settings文件中(参数名大写)
2).在管道中使用数据库参数连接数据库
3).在process_item方法中将数据写入数据库
7.MongoDB的基本使用
1)安装及导包
pip3 install pymongo
from pymongo import MongoClient
2)链接
client= MongoClient(host,port) 链接服务器
db = client[
col = db[
1)基本操作
sudo mongod 默认启动
mongo 链接mongo数据库
2)简单操作
show dbs 查看数据库
use
show collections 查看当前数据库下集合
db.collection_name.drop() 删除集合
db.dropDatabase() 删除当前数据库
3)增删改查
db.colname.insert(data) 插入数据
db.colname.remove(query) 删除数据
db.colname.update(query,data) 更新数据
db.colname.find(query) 查询数据
06-scrapy
2017年11月17日
20:43
1.反爬虫的原因
降低服务器负载
维护企业的竞争力
2.常见反爬的三个方向(混合使用)
1)判断用户身份
· User-Agent · Cookies
· Refer · 验证码
2)分析用户行为
通过并发识别爬
在线活动时间
页面添加一些正常浏览器浏览访问不到的资源
3)动态加载数据
ajax、js
3.Scrapy常见反反爬措施
1)模拟用户头
设置位置(只需设置一个):
①settings文件
②创建请求时
③下载器中间件(权限最高)
2)设置请求延迟
settings文件中 DOWNLOAD_DELAY = n
测试目标站点阈值后设置
3)不带Cookies
settings文件中 COOKIES_ENABLED = False
4)IP代理池
IP代理来源:
国内代理: 付费代理 质量高,费用高,
采集免费代理 质量低,成本高,需要定期维护
自建IP代理池 :云主机支持多ip 成规模也需要很高费用
ADSL拨号服务器 价格便宜
Crawlera: scrapy自有 网速慢,需要购买账号
5)动态数据加载,中间件使用selenium电泳浏览器
scrapy只能获取静态页面响应
要获取动态加载数据需要在中间件中使用selenium
注:
①使用selenium之后scrapy高性能优势将会消失
②有些站点能够识别phantomjs浏览器, 需要使用带界面浏览器
4.Scrapy下载器中间件(DOWNLOADER_MIDDLEWARES)
概念:
引擎与下载器之间的一个组件,一个爬虫可以有多个下载器中间件
作用:
全局修改Scrapy request和response(请求与响应)
使用:
①编辑文件: settings文件同级目录的middlewares.py文件
低版本scrapy需要自行创建,高版本scrapy自动创建
②编写处理方法
处理请求:
process_request(self, request, spider)
功能: 加用户头
加代理
调用selenium获取动态加载数据
处理响应:
process_response(self, request, response, spider)
基本不用
开启中间件:
在settings文件中配置DOWNLOADER_MIDDLEWARES参数
设置方法同管道
5.手机抓包
6.setting设置及信息
1)log信息
LOG_ENABLED 是否开启log
LOG_ENCODING 编码格式
LOG_FILE log文件路径
LOG_LEVEL:
CRITICAL | 严重错误 |
---|---|
ERROR | 一般错误 |
WARNING | 警告信息 |
INFO | 一般信息 |
DEBUG | 调试信息 |
选择LOG等级后,只会打印其和其等级之上的LOG信息
2)部署时可能用到的setting配置项
CONCURRENT_REQUESTS | 下载器并发数量设置,默认16 |
---|---|
DEPTH_LIMIT | 爬取深度 |
DOWNLOAD_TIMEOUT | 下载超时 |
CONCURRENT_ITEMS | item管道同时处理item数量 |
CONCURRENT_REQUESTS_PER_DOMAIN | 域名的并发请求 |
CONCURRENT_REQUESTS_PER_IP | ip的并发请求数量 |
07-scrapy—redis
2017年11月18日
9:10
1.配置redis
1)Windows下
设置系统环境变量,在path中新加redis目录
修改配置文件redis.conf,注销bind配置,否则其他用户不可访问
启动服务:
redis-server 配置文件路径
2)Linux下
修改配置文件redis.conf,注销bind配置
开启守护进程 :daemonize yes(window不能设置)
启动服务:
sudo redis-server /ect/redis/redis.conf
关闭服务:
sudo server redis-server stop
3)连接测试
1.master端(本地连接)
redis-cli
2.非master端(远程连接)
redis-cli -h master_ip
2.scrapy-redis分布式组件
1)分布式
概念:
由多台机器协同完成一个任务,从而缩短人物的执行时间
优点:
提升了项目的整体进度
单个节点不稳定不会影响整个任务的执行
2)问什么要使用scrapy-redis组件
Scrapy多个spider不能共享爬取队列,自身并不支持分布式爬虫
该组件粘合了redis数据库和scrapy框架,完美地解决了scrapy宽家五福进行分布式数据采集的缺点
3)使用时替换的组件(除下载器)
3.创建scrapy-redis分布式爬虫
1)setting设置:
# 设置重复过滤器为scrapy-redis的重复过滤器,原来的弃用
DUPEFILTER_CLASS = “scrapy_redis.dupefilter.RFPDupeFilter”
# 使用scrapy——redis组建的调度器
SCHEDULER = “scrapy_redis.scheduler.Scheduler”
# 保持任务队列的状态
SCHEDULER_PERSIST = True
# 启用数据队列管道(可选)
‘scrapy_redis.pipeline.RedisPipeline’: 400
# 设置redis数据库地址
REDIS_URL = ‘redis://ip: port’
2)
2.
3.scrapy-redis有保持任务状态的作用
SCHEDULER_PERSIST = True
4.python3中filter改成list
5.数据清洗:
入库前清洗
入库后清洗
6.清空redis数据库:flushdb
装饰器,简历适当
IT橘子
遇到的坑
ping++——python支付
简历 3+2项目