• 大型分布式爬虫准备 scrapy + request


    那些高手

    爬虫好文

    而我避免这些问题的方式,控制台清除所有定时
    
     var id = setInterval(function() {}, 0);
    while (id--) clearInterval(id);
    
    $(articleSelector).css('height', 'initial')
              $(articleSelector).removeClass('lock')
              $('#locker').css('display', 'none')
    
    

    python 运行 js 脚本

    pip install PyExecJS
    
    eleme.js
    
    function getParam(){
        return 'hello world!'
    }
    
    
    xxx.py 
    
    import execjs
    
    import os
    
    os.environ["EXECJS_RUNTIME"] = "PhantomJS"
    node = execjs.get()
    file = 'eleme.js'
    ctx = node.compile(open(file).read())
    js_encode = 'getParam()'
    params = ctx.eval(js_encode)
    print(params)
    

    python 包管理

    virtualenv virtualwrapper pipenv pyenv --》 conda
    
    

    步骤

    1. pipenv shell
    2. pip install scrapy
    3. scrapy shell   # 可以做 简单调试
    3. scrapy startproject videospider  # 生成 基本骨架
    4. scrapy genspider jobbole  www.jobbole.com
    5. 取巧 构造一个 main.py  用来在 IDE 里调试
    
    

    爬虫中 url 去重

    set 去重 是 非常占用内存的
    md5 信息摘要 算法 之后会省很多, 但是仍然不如 bitmap 方式
    
    bitmap  会 很容易 造成 hash 冲突
    
    bloom filter  这一种 可以通过 hash 函数 减少 hash 冲突
    
    简而言之 言而简之 urls --> set(urls) --> set(md5(url) s) --> bitmap( xxx ) --> bloom filter( multi_hash_func ( xxx ))
    

    下面这个教程要看评论再说。。。坑哭了

    https://blog.csdn.net/chenvast/article/details/79103288
    

    爬取 cnblog 文章 练手

    # 使用 pipenv 管理环境
    mkdir spiders
    cd spiders
    pipenv install
    
    pip install scrapy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
    
    # 利用 模板生成 项目基本样子 类似于 springboot
    scrapy startproject ArticleSpider
    
    # 爬取 二级域名下的 文章
    cd  xxxArticleSpiderArticleSpiderspiders
    scrapy genspider cnblog news.cnblogs.com
    
    # 修改 settings.py 中 的 爬虫配置 ROBOTSTXT_OBEY  为 False
    ROBOTSTXT_OBEY = False
    
    # 打开 编辑自动生成的 spider/cnblog.py
    # -*- coding: utf-8 -*-
    import scrapy
    import re
    from ArticleSpider.items import ArticleItem
    from ArticleSpider.utils.utils import get_md5
    from scrapy.http import Request
    from urllib import parse
    
    class CnblogSpider(scrapy.Spider):
        name = 'cnblog'
        allowed_domains = ['news.cnblogs.com']
        start_urls = ['http://news.cnblogs.com/']
    
        def parse(self, response):
            news_selector_list = response.xpath('//div[@id="news_list"]/div[@class="news_block"]')
            for news_selector in news_selector_list:
                content = news_selector.xpath('div[@class="content"]')
                anchor = content.xpath('h2/a')
                article_url = anchor.xpath('@href').extract()[0]
                article_title = anchor.xpath("text()").extract()[0]
                article_front_image_url = content.xpath('div[@class="entry_summary"]/a/@href').extract()[0]
                footer = content.xpath('div[@class="entry_footer"]')
                article_author = footer.xpath('a/text()').extract()[0]
                matched = re.match('评论((d+))', footer.xpath('span[@class="comment"]/a/text()').extract()[0])
                article_comments =  matched.group(1) if matched else 0
                article_view = footer.xpath('span[@class="view"]').extract()[0]
                article_tag = footer.xpath('span[@class="tag"]').extract()[0]
    
                article_item = ArticleItem()
                article_item['article_url'] = article_url
                article_item['article_title'] = article_title
                article_item['article_front_image_url'] = article_front_image_url
                article_item['article_author'] = article_author
                article_item['article_comments'] = article_comments
                article_item['article_view'] = article_view
                article_item['article_tag'] = article_tag
                article_item['article_id'] = get_md5(article_url)
                yield Request(url=parse.urljoin(response.url ,article_url),meta={"item":article_item}, callback=self.parse_detail)
            pass
    
        def parse_detail(self, response):
            pass
    
    
    # 有些时候 我们可以使用 Itemloader 来让我们的代码变得更友好
    item_loadder = ItemLoader(item=ArticleItem(), response=response)
    item_loadder.add_xpath(field_name="article_url", xpath="//div[@id='news_list']/div[@class='news_block']/div[@class='content']/h2/a/@href")
    .
    .
    .
    next_urls_selector = response.xpath('//*[@id="sideleft"]/div[5]/a[11]')
    
    

    总结 对付反爬

    访问 500  一般是 UA 没设置
    cookie  携带
    token 
    salt
    sign
    ctrl + shift + f 很好用 在查找 js 调用时候
    cookies  池
    ip 代理 池
    
    pip3 install faker
    
    https://cmder.net/
    
    

    搭建自己的 ip 代理池

    mongo db 安装使用

    # 创建 ipproxy 数据库  如果没有就创建
    use ipproxy;
    
    ### 插入数据
    db.ipproxy.insert({"ip_port":"192.168.0.18:5678"})
    
    # 删除 数据库
    db.dropDatabase()
    
    # 删除集合
    db.collection.drop()
    
    # 查询集合
    db.ipproxy.find().pretty()
    
     db.createCollection("mycol", { capped : true, autoIndexId : true, size : 
       6142800, max : 10000 } )
    
    db.ipproxy.drop()
    
  • 相关阅读:
    定点数的表示
    [收集]XMPP使用tls 和sasl登录
    socket函数
    [收集] SendMessage、PostMessage原理
    DLL中用malloc分配了一块内存,但是在exe程序中释放引发的错误:其原因可能是堆被损坏,这也说明 **.exe 中或它所加载的任何 DLL 中有 bug。
    关于在IWebBrowser中无法响应Ctrl+C等快捷键的解决方法
    Enum 操作
    程序员面对分歧和难题应当具备的态度【转】
    NDIS学习笔记一
    NDIS学习笔记二——(模拟丢包)
  • 原文地址:https://www.cnblogs.com/Frank99/p/11469180.html
Copyright © 2020-2023  润新知