2w爬虫课程总结笔记

作者: 叫我老村长 | 来源:发表于2018-11-05 23:26 被阅读4次
    about-BY-gentle.jpg

    爬虫

    模拟客户端发起网络请求,获取网络数据
    只要客户端能够获取的数据,爬虫都能获取

    获取流程:

    1.确定目标网站,分析网址目标url

    1. 根据url发起请求,获取服务器返回的响应。
    2. 从响应中提取目标数据:
        a.提取目标数据
      b.提取新的url,执行第二步的循环
    3. 最终,所有的目标url访问完毕,查询结束

    为什么使用python语言写我们的爬虫?

    php 写多任务支持不好,多线程这块,所以不适合写爬虫,写后台不错
    c/c++ 语言写爬虫,工作量比较大,需要重构,都是从底层去写,运行的效率高(仅次于汇编语言)。适用于写框架
    java 可以写爬虫,python的最大竞争对手,java的生态圈比较完善,支持的库也很多,但是代码量特别大,重构的成本比较高。
    python 代码简洁,语法优美,支持大量的三方模块,对多任务的支持也是友好的,并且有成熟的scrapy爬虫框架和scrapy-redis分布式爬虫框架。

    七层协议

    应用层:http
    表示层:加密
    会话层:会话层管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话.
    传输层:tcp/udp

    URI(Uniform Resource Identifier):统一资源标识符
    URL(Uniform / Universal Resource Locator的缩写):统一资源定位符,是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。
    URN(Universal Resource Name):统一资源名称,只命名资源而不指定如何定位资源

    如何处理得到的响应结果

    1.本地文件存储
    2.csv文件操作
    3.持久化(数据库,mysql)
    结构化数据  ---> 拉钩  数据以json形式,层级嵌套
    非机构数据 嵌套在网页上的

    urllib模块

    request

    1.找url
    2.分析url,构建强求request对象  -> req =request.Request()
    3.根据构建的request对象发起请求   -> response=request.urlopen(req
    1.get请求
    2.post请求
    
    cookiejar,存服务器返回来的cookies信息
    MozillaCookieJar(cookies保存在本地)
    

    requests

    get
    pose(拉钩网)
    cookies
    sesson
    

    xpath

    xpath(xml path language):是一门在xml文档中对元素和属性进行便利语言
    

    Beatifulsoup

    xpath解析效率比beatifulsouo 高   Beatifulsoup  --->  支持css选择器
    

    任务 进程 线程

    任务  --> 进程  --> 线程
    并发:同时发起多个任务,但是任务是一个个交替执行的。
    并行(多核):任务数量小于等于核心数量,这时候我们的所有任务相当于同时进行。

    1.多任务
    2.cpu如何处理任务的
    3.并发 并行
    4.实现多任务方式
    1.多线程
    #线程锁:
    # 当我们创建多个线程取修改同意变量的时候,这时候可能会造成资源混乱

    json

    json.loads():将json字符串转为python数据类型。
    dumps:将python的数据类型转化为json字符串
    dump:将python的数据类型转换为json字段串,并保存在本地文件
    load:将本地json文件中的json数据,转换为python数据类型
    

    模拟登录+PhantomJS

    1.导包
    2.#创建一个浏览器驱动对象
    3.访问网站driver.get('http://www.baidu.com/')
    实例模拟登录(比如重写start_requests获取cookies)
    1.from selenium import webdriver
    2.创建一个浏览器的驱动
    3.根据目标网址,打开页面
    4.找到输入框
    5.点击登录按钮,完成登录
    

    模拟登录+验证码识别

    1.from selenium import webdriver
    from PythonHTTP.YDMHTTPUSE import get_yanzhengma_result  打码平台
    2.创建一个浏览器的驱动
    3.根据目标网址,打开页面
    4.输入账号,密码
    5.根据图片识别验证码
            filename = 'code_image.png'
            codetype = '3006'
            cid,result = get_yanzhengma_result(filename,codetype)
    
            print(result)
    6.点击登录按钮
    
    #手动解码 
    图片二值化处理
    

    scrapy爬虫项目创建

        1.创建项目
            scrapy startproject projectname
            进入spiders文件夹下
            选择是否能用通用爬虫,  ----> 因为多个页,分页如果在当前页面  -->  通用爬虫  --> 否则,不能
            建立普通爬虫
        2.创建爬虫文件
            最好域名设置对,防止以后忘记更改
            聚焦爬虫创建方法
                scrapy genspider qnw qunar.com
            通用爬虫创建方法:
                scrapy genspider -t crawl ziru ziroom.com
    
        3.打开工程,打开创建的项目.
        1.切换创建的虚拟环境 (或者每次创建一个新的虚拟环境)
        2.改setting 文件  
            1.ROBOTSTXT_OBEY = False
            2.DOWNLOAD_DELAY = 2
            3.COOKIES_ENABLED = False
            4.DEFAULT_REQUEST_HEADERS
            添加ua'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Mobile Safari/537.36',
            #可选方法
            #一般情况下,我们将数据库的配置信息,写在settings.py文件中
            注意:
                    #自定义settings.py中的参数设置,
                    #优先级比settings.py文件中设置的参数要高
        3.items.py 里面根据需求定义字段
            格式 : title = scrapy.Field()
    
        4.爬虫文件
        1.设置起始url 
            1.找前三页url分析其规律 也是为了构建下一页
            2.把第一页url设为起始url
                #可以设置多个url
                    start_urls = ['https://tuan.qunar.com/vc/index.php?category=all&limit=0%2C30',
                        'https://tuan.qunar.com/vc/index.php?category=all_i&limit=0%2C30',
                        'https://tuan.qunar.com/vc/index.php?category=all_o&limit=0%2C30',
                        ]
    
            #可选
            ##自定义起始url回调方法:
            重写start_requests
                #def start_requests(self):
                # 使用场景:当你访问某个网站的时候,必须要登录之后,才可以获取数据
                # 这时我们需要要重写start_requests,在这个方法里面模拟登录,获取
                # coolies.
                #1.需要模拟登录
                2.打开github登录页面
                3.添加账号,密码
                4.点击登录按钮
                5.获取cookies
                    cookies = driver.get_cookies()
                    cookies_dict = {note['name']:note['value'] for note in cookies}
                    print(cookies_dict)
                    for url in self.start_urls:
                    yield scrapy.Request(url=url,cookies=cookies_dict,dont_filter=True,callback=self.custome_parse)
    
    
        2. def 解析 parse(self, response)
        -->  提取详情链接  ---> 页面源码看是否能找到匹配的东西 --->找到或者找不到
        --->  找不到 -->  json  js  or  script加载格式  ....
        ---->  script加载格式  ---> re取匹配
    
        附加:
        执行二种方式
            1.scipy carwl name
            2.main
                1.创建main.py 
                import os,sys
                from scrapy.cmdline import execute
                #os.path.abspath(__file__)  --> 当前文件绝对路径 (找到main.py的路径)
                #再传到系统文件里面
                sys.path.append(os.path.dirname(os.path.abspath(__file__)))
                execute(['scrapy','crawl','quna'])
    
                2.右键  run main   or debug main
    
    
        5.管道
        可以自定义数据管道(注意激活管道)
        负责
    
        #可选方法
                1.close_spider  爬虫结束的时候调用
                2.open_spider   爬虫开启的时候调用
    
        数据持久化
                1.在item对应类中,定义一个方法,返回sql语句和要插入的数据。
                2.使用item调用这个方法,得到返回sql语句和要插入的数据。
                3.执行插入操作
                    类方法
                    @classmethod
                    crawler   --->  包含了爬虫一些核心组件
                    可以获取setting 中的一些参数
        图片下载
            1,正常发起请求,获取图片二进制文件,保存。
            2.自定义图片管道,继承ImagesPipeline
            重写二方法            
    
        6.Middleware
            #中间件以及反反爬:
            DOWNLOAD_DELAY = 2
            COOKIES_ENABLED = False
            DEFAULT_REQUEST_HEADERS = {
                'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
            }
            #中间件
            ip设置
            设置ua,手动设置
            cookies的设置:
            sessinum设置
    

    通用爬虫创建与聚焦的程序写法区别

        # rules = (
        #       Rule(
        #           LinkExtractor           设置提取规则
        #           (allow= r'.*?p=\d+',   ---->  相反的 deny  
        #            #allowed_domains 要提取在这个域下  ------>  deny_allowed_domains(优先级高)
        #            restrict_xpaths=('//div[@class="pages"]'),    提取这个div块下的标签,  -->restrict_css
        #            ),
        #          callback='parse_data',   设置回调函数
        #          follow=True,             是否跟进
    
        #          process_links: 设置一个函数,根据正则提取的所有url都能在process_links回调函数中获取到--> 作用某些url进行拦截处理的时候用到
        #          process_request: 设置一个函数,根据正则提取的所有url都能在process_request中拦截到url构建的request对象.
        #       ),
        #       )
    
    
    
    区别:
        Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则Rule
        来提供跟进链接的方便的机制,从爬取的网页结果中获取链接并继续爬取的工作.
    
    注意:
        注意:
        1.当编写爬虫规则时,避免使用parse作为回调函数。
        由于CrawlSpider使用parse方法来实现其逻辑,如果覆盖了 parse方法,
        crawl spider将会运行失败。
    
        2.要获取起始url的响应,必须重写parse_start_url
        3.在设置Rule对象的时候,没有callback回调函数的时候,默认表示跟进.
    
    
    使用:
    当我们提取数据的目标网站的网址很有规律,并且模块很清晰,我们可以使用通用爬虫.
    (不同于聚焦,引擎)
    

    暂停与恢复

    scrapy crawl somespider -s JOBDIR=crawls/somespider-1
    

    相关文章

      网友评论

        本文标题:2w爬虫课程总结笔记

        本文链接:https://www.haomeiwen.com/subject/dhzexqtx.html