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项目