简单爬虫笔记


    爬虫
        Beatuiful Soup:网页解析器
            from bs4 import BeatuifulSoup
            html_doc:HTML文档字符串
            html.parser:HTML解析器
            from_encoding='utf8':文档的编码
            find all/find:搜索节点
                find_all(name,attrs,string)
                    soup.find_all('a'):查找所有标签为a的节点
                    soup.find_all('a',href='/view/123.html'):查找所有标签为a,链接符合/view/123.html形式的节点
                    soup.find_all('div',class_='abc',string='python'):查找所有标签为div,class为abc,文字为python的节点
            访问节点信息
                node.name:获取查找到的节点标签名称
                node['href']:获取查找到的a节点的href属性
                node.get_text():获取查找到的a节点的链接文字
    
            
                
                    
        使用场景
            通用爬虫
                抓取系统重要组成部分,抓取的是一整张页面数据
            聚焦爬虫
                是建立在通用爬虫的基础之上,抓取的是页面中特定的局部内容
                编码流程
                    1.指定url
                    2.发起请求
                    3.获取响应数据
                    4.数据解析
                    5.持久化存储
            增量式爬虫
                检测网站中数据更新的情况,只会抓取网站中最新更新出来的数据
        爬虫的矛和盾
            反爬机制
                门户网站,可以通过指定相应的策略或者技术手段,防止爬虫程序进行网站数据的爬取
                robots.txt协议
                    规定了网站中哪些数据可以被爬取,哪些不可以爬取
            反反爬策略
                爬虫程序可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而获取到想要的信息
            验证码
                识别验证码图中数据用于模拟登陆操作
                识别验证码的操作
                    人工肉眼识别(不推荐)
                    第三方平台模拟识别
                        使用打码平台识别验证码的编码流程
                            1.将验证码图片进行本地下载
                            2.调用平台提供的实例代码进行图片数据识别
        检查网络请求
            标头 header
                请求URL:爬虫要爬取的网页链接
                请求方法:post,get
                Content-Type:查看请求的类型 
                    text/html/plain(纯文本)/xml/gif/jjpeg/png
                    application/json(数据格式)/pdf/word
                User-Agent:访问用户
            负载payload
                表单数据
            响应
                要爬取的
        http和https协议
            http协议
                服务器和客户端进行数据交互的一种形式
            https协议
                安全的超文本传输协议(涉及数据加密)
            常用请求头信息
                User-Agent:请求载体的身份标识
                Connection:请求完毕后,是断开连接还是保持连接
            常用响应头信息
                Content-Type:服务器响应回客户端的数据类型
            加密方式
                对称密钥加密
                非对称密钥加密
                证书密钥加密
            无状态
                没有请求到对应页面数据的原因
                    发起的第二次基于个人主页页面请求的时候,服务器端并不知道该次请求是基于登陆状态下的请求
        requests 库
            python中原生的一款基于网络请求的模块,作用是模拟浏览器发送请求
            requests.get/post()
                url:要下载的目标网页的URL
                params:字典形式,设置URL后面的参数
                data:字典或者字符串,一般用于post方法时提交数据
                headers:设置user-agent,refer等请求头
                timeout:超时时间,单位是秒
                verify:True/False,是否进行HTTPS证书验证,默认是,需要自己设置证书地址
                allow_redirects:True/False是否让requets做重定向处理,默认是
                cookies:附带本地的cookies数据
            接收response响应
                r = requests.get/post(url)
                    r.status_code:查看状态码,如果等于200则请求成功
                    r.encoding:可以查看当前编码,以及变更编码
                    r.text:查看返回的网页内容
                    r.headers:查看返回的HTTP的headers
                    r.url:查看实际访问的URL
                    r.content:以字节的方式返回内容,比如用于下载图片
                    r.cookies:服务端要写入本地的cookies数据
            requests模块的编码流程
                1.指定url 
                UA检测/UA伪装
                2.发起请求
                3.获取响应数据
                4.持久化存储
        数据解析
            数据解析原理概述
                解析局部的文本内容进行存储
                1.进行指定标签的定位
                2.标签或者标签对应的属性中存储的数据值进行提取(解析)
            数据解析的分类
                正则表达式
                    
                bs4
                    python中独有
                    bs4数据解析原理
                        1.实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
                            1.将本地的html文档中的数据加载到该对象中
                            2.将互联网上获取的页面源码加载到该对象中
                        2.通过调用BeatifulSoup对象中相关的属性或者方法进行标签定位和数据提取
                        方法和属性
                            soup.tagName: 返回html中第一次出现的tagName标签
                            soup.find(‘tagName’):和soup tagName一样
                                soup.find('div',class_/id/attr='')#可以根据属性定位
                            soup.find_all('tagName'):返回符合要求的所有标签(以列表的形式)
                            soup.select('某种选择器(id,class,标签...选择器)') (返回的是一个列表)
                                soup.select('.标签 > ul >li >a') 
                                    >:表示的是一个层级
                                    空格表示多个层级
                                soup.a.text/string/get_text()
                                    text/get_text():可以获取某一个标签中所有的文本内容
                                    string:只可以获取该标签下面直系的文本内容
                                属性值 :soup.a['属性']
                xpath
                    最常用且最便捷高效的一种解析方式,通用性很高
                    xpath解析原理
                        1.实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中
                            1.将本地的html文档中的源码数据加载到etree对象中(etree.parse(filePath))
                            2.可以将从互联网上获取到的源码数据加载到该对象中(etree.HTML('page_text'))
                        2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
                    xpath表达式
                        /:表示从根节点开始定位,表示一个层级
                        //:表示多个层级 相当于bs4中的空格
                        属性定位://tag[@attrName="attrValue"]
                        索引定位:索引是从1开始的,在定位后加偏移量[x]
                        取文本:/text():取直系的文本  //text()取非直系的文本
                        取属性:@attrName
        os相关
            创建一个文件夹
                if not os.path.exists('./picLibs'):
    os.mkdir('./picLibs')
            with open(r'filename.txt') as f:
   data_user=pd.read_csv(f)  #文件的读操作
            with open('data.txt', 'w') as f:
   f.write('hello world')  #文件的写操作
        模拟登录
            爬取基于某些用户的用户信息
            cookie
                用于让服务器端记录客户端的相关状态
                手动cookie处理
                    通过抓包工具获取cookie值,将该值封装到headers(不建议使用)
                自动处理
                    cookie的值来源是模拟登录post请求后,由服务器端创建
                    session会话对象
                        作用
                            1.可以进行请求发送
                            2.如果请求过程中产生了cookie,则该cookie会被自动存储发送
                        创建一个session对象:session = requests.Session()
                        使用session对象进行模拟登录post请求的发送(cookie就会被存储在session中)
                        session对象对个人主页对应的get请求进行发送(携带了cookie)
            代理
                破解封IP这种反爬机制
                作用
                    突破自身IP访问的限制
                    隐藏自身真实IP
                相关网站
                    http://ip.yqie.com/ipproxy.htm
                代理IP的类型
                    http:应用到http协议对应的url中
                    https:应用到https协议对应的url中
                代理ip的匿名度
                    透明:服务器知道该次请求使用了代理,也知道请求对应的真实ip
                    匿名:知道使用了代理,不知道真实ip
                    高匿:不知道使用了代理,更不知道真实ip
        一些错误
            乱码
                #可以手动设定数据编码的格式
#response.encoding = 'utf-8'
                #通用处理中文乱码的解决方案

    img_name =  li.xpath('./a/img/@alt')[0] + '.jpg'
    img_name=img_name.encode('iso-8859-1').decode('gbk')
             list index out of range
                原因是在中这个网站的html代码中有的标识为空,只要加上try.....except IndexError: pass 错误机制跳过空值就行了
        高性能异步爬虫
            目的:在爬虫中使用异步实现高性能的数据爬取操作
            异步爬虫方式
                多线程,多进程(不建议)
                    好处:可以为相关阻塞操作单独开启线程或者进程,阻塞操作就可以异步执行
                    弊端:无法无限制的开启多线程或者多进程
                进程池,线程池(适当使用)
                    好处:我们可以降低系统对进程或者线程创建和销毁的一个频率,从而很好的降低系统开销
                    弊端:池中线程或者进程的数量是有上限的
                单线程+异步协程(推荐)
                    event_loop
                        事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行
                    coroutine
                        协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用,我们可以使用async关键字来定义一个方法,这个方法在调用时不会被立即执行,而是返回一个协程对象
                    task
                        任务,它是对协程对象的进一步封装,包含了任务的各个状态
                    future
                        代表将来执行或还没有执行的任务,实际上和task没有本质区别
                    async
                        定义一个协程
                    await
                        用来挂起阻塞方法的执行
        selenium
            便捷的获取网站中动态加载的数据
                便捷实现模拟登录
            基于浏览器自动化的一个模块
            使用流程
                下载一个浏览器的驱动程序
                实例化一个浏览器对象
                编写基于浏览器自动化的操作代码
            操作代码
                发起请求:get(url)
                标签定位:find系列方法
                标签交互:send_keys("   " )
                执行js程序:excute_script('jsCode')
                前进,后退:forward(),back()
                关闭浏览器:quit()
            处理iframe
                如果定位标签存在于iframe标签之中,则必须使用swich_to.frame*id)
                动作链:from selenium.webdriver import ActionChains
                click_and_hole(div):长按且点击操作
                move_by_offset(x,y)
                perform()让动作链立即执行
                action.release()释放动作链对象
        scrapy框架
            爬虫中封装好的一个明星框架
            功能
                高性能的持久化存储
                异步的数据下载
                高性能的数据分析
                分布式
            基本使用
                创建一个工程 :scrapy startproject xxx
                cd xxx
                在spiders子目录中创建一个爬虫文件
                scrapy genspider spiderName www.xxx.com
                执行工程:scrapy crawl spiderName
            持久化存储
                基于终端指令
                    只可以将parse方法的返回值存储到本地文本文件
                    scrapy crawl 对应的爬虫文件名 -o ./filePath

                    注意:持久化存储对应的文本文件的类型值可以是('json', 'jsonlines', 'jsonl', 'jl', 'csv', 'xml', 'marshal', 'pickle')
                    局限性比较强(数据只可以存储到指定后缀的文本文件中)
                基于管道
                     数据解析
                    在item类中定义相关的属性
                    将解析的数据封装存储到item类型的对象
                    将item类型的对象提交给管道进行持久化存储
                    在管道类的process_item中要将其接受到的item对象中存储的数据进行持久化存储操作
                    在配置文件中开启管道
        分布式爬虫
            搭建一个分布式机群,让其对一组资源进行分布联合爬取
                提升爬取数据效率
            

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小梁今天敲代码了吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值