15天基础爬虫、selenium、scrapy使用,附全程实现代码

15天基础爬虫、selenium、scrapy使用,附全程实现代码_第1张图片

 

Day 1
http协议
 - 概念:就是服务器和客户端进行数据交互的一种形式
常用的请求头信息
- User-Agent: 请求载体的身份标识
- Connection: 请求完毕后是断开连接还是保持连接
常有的响应头信息
 -Content-Type: 服务器响应回客户端的数据类型
https协议
- 安全的超文本传输协议,(传输数据时有加密)

加密方式
 - 对称密匙加密(弊端:传输时很有可能被第三方机构拦截密匙和数据)
 - 非对称  (服务器发送公钥给客户端,服务器自己有私钥解密,缺点 1.效率低, 2.第三方拦截公钥再发送给客户端)
 - 证书密匙加密 (https)(证书机构给公钥认证,再发给客户端)    

模块
- urllib模块
- requests模块

requests模块:python原生模块,功能强大,效率极高
作用:模拟浏览器发送请求
如何使用:(requests模块编码流程)
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储


局部刷新
- 数据解析(还未学)
- 阿贾克斯请求(ajax请求)(1.百度翻译破解,2.肯德基地址查询,3药监局数据爬取(已改,ajax请求参为随机参数))


注 - 携带参数的url用字典进行封装
    - 进行UA伪装
    - 正则表达式 批量加引号   ( (.*?): (.*) ) (  "$1": "$2",  ) 或者ctrl+alt+shift选取多个光标加引号(第一步crtl+r,选定区域,加入正则表达式 (.*?):(.*),替换为'$1':'$2',,再勾选match case和regex以及in selec,就可以了)
    - 字典参数中键值不能有空格否则得到的是一个空列表
    - 如果相关数据爬取后是乱码,说明是动态数据,可能是ajax数据

Day 2
聚焦爬虫
 -爬取页面中指定信息
  - 正则(看是白月黑羽好吧,难怪我搜不到)(1.百度贴吧图片爬取)
  - bs4(1. 诗词名句网章节内容爬取)
  - xpath(重点)(1.彼岸网图片爬取, 2.全国城市名称爬取, 3.58二手房名称爬取,4,站长简历模板数据爬取)
- 解析的局部内容都会在标签之间或者标签对应的属性中
- 进行指定标签的定位
- 标签或标签对应的属性值进行提取(解析)

编写流程
- 指定url
- 发起请求
- 获取响应数据
--数据解析
- 持久化存储

正则(练习网站 www.regex101.com)(其他语言通用)






ex = ''


https://file.izuiyou.com/img/view/id/1991059917




bs4 
- 实例化一个BeautifulSoup对象,并且将页面源码数据加载到该对象中
- 通过调用BeautifulSoup对象中相关属性或者方法进行标签定位和数据提取

- 对象实例化:
  - 将本地的html文档中的数据加载到该对象中
       fp = open('文件名', 'r', encoding='utf-8')
       soup = BeautifulSoup(fp, lxml)
  - 将互联网上获取的页面源码加载到该对象中
       page_text = response.text
       soup = BeautifulSoup(page_text, 'lxml')
# print(soup)
    # print(soup.a)
    # soup.tagName 返回的是html中第一次出现的tagName标签
    # print(soup.div)
    # print(soup.find('div'))  # 相当于soup.div
    # print(soup.find('div', class_='song'))
    # print(soup.find_all('a'))  # f返回的是所有标签 (列表)
    # print(soup.select('.tang')) # select('id, class, 标签...选择器) '),返回的是一个列表
    # print(soup.select('.tang > ul > li > a')[0]) # 层级选择器 > 表示的是一个层级
    # print(soup.select('.tang > ul  a')[0]) 空格  ‘ ’空格表示多个层级
    # print(soup.select('.tang > ul > li > a')[0].text/string/get_text())
    # text/get_text() : 可以获取某一个标签中的所有文本内容(可以不是直系标签文本内容)
    # print(soup.find('div', class_='song').string)
    # string : 只能获取标签下的直系文本内容
    # print(soup.select('.tang > ul  a')[0]['href']) 获取标签中的属性值

Day 3

乱码可以参考page_text = page_text.content.decode('utf-8')
出现乱码的,分别在12行和24行最后加上‘.encode('ISO-8859-1')’
我也用的笔趣阁,要注意获取相应数据前要编码,用gb18030,否则中文乱码


Xpath(返回的是一个列表)
  - 实例化一个etree的对象,且需要被解析的页面源码数据加载到该对象中。
  - 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获
- /:表示从根节点开始定位,表示的是一个层级
- //:表示多个层级, (在最左侧时表示从任意位置开始定位)
- 属性定位: //div[@attrName="attrValue"]
- 索引定位: //div[@class = "song"]/p[3] (索引从1开始)
- 取文本 
          - /text()获取的是标签中直系的文本内容
          - //text()获取的是标签中非直系的文本内容(所有的文本内容)
 - 取属性
          -//div[@class="song"]/img/@src  (img/@src)


tree.xpath('//section[@class="list"]//div[@class="property-content-title"]/h3/@title')(58同城二手房名字xpath路径)
推荐一个浏览器插件 XPath Helper ,可以直接获取元素xpath路径
copyxpath



  - 乱码问题用  .encode('iso-8859-1').decode('gbk') 或 encoding = 'utf-8'
//*[@id="main"]/div[3]/ul/li[1]/a/img
//*[@id="container"]/div[1]/a
  - 当编码格式一样是仍然无法解决时,requests请求返回用.content,可以解决中文乱码问题。
  - 抓包工具中的代码可能和网页源码不一样,这时候需要打开网页源码来写xpath


Day 4

验证码识别(超级鹰,python自带库 : ddddorc  , tesseract)
2022/6/13摸索出来了pytesseract登陆古诗文网的方法,详细请看我这一天发的评论

模拟登录编码流程    (1.古诗文网登录(带验证码,以及登录后的页面数据对应的二次页面数据爬取))
   - 验证码的识别,获取验证码图片的文字数据
   - 对post请求进行发送,(处理请求参数)
   - 对响应数据进行持久化存储

注 
   - 使用抓包工具时要勾选 Preserve log ,找到 login
http/https协议特性: 无状态
没有请求到对应的页面数据原因:
      发起的第二次请求基于个人主页页面请求的时候,服务器端并不知道该请求是基于登录状态下的qingq
cookie :用来让服务器端记录客户端的相关状态  (古诗文网是:collect.aspx)
    - 手动处理:通过抓包工具将该值封装到headers中。(不建议)
    - 自动处理: - cookie值是来自哪里?
                       - 模拟登录post请求后,由服务器创建。
                       session会话对象:
                        - 作用:
                                  1 可以进行请求的发送
                                  2 如果请求过程中产生了cookie,则该cookie会被自动村春/携带在该session对象中
                        - 使用session对象进行模拟登录post请求的发送(cookie就会被自动存储在session中)
                        - session对象对个人主页对应的get请求进行发送(携带了cookie)

代理 :破解封ip这种反爬机制
什么是代理 :
      - 代理服务器 (客户端——代理服务器——服务器网站)
代理的作用 :
      - 突破自身ip访问的限制。(访问一些自身ip不能访问的网站)
      - 隐藏自身真实ip
代理ip的类型:
      - http :应用到http协议中
      - https :应用到https协议中
代理相关网站:
      - 快代理
      - 西祠代理(已挂)
      - www.goubanjia.com
http://free-proxy.cz/zh/  有梯子可以上这个网站,里面有很多的国外ip,不过大多数都很慢
芝麻HTTP还行,一开始有赠送20,使用最便宜的那个一次才0.04

代理ip的匿名度 :
      - 透明:服务器知道该次请求使用了代理,也知道请求对应的真实的ip
      - 匿名:知道使用了代理,不知道真实ip
      - 高匿:不知道使用了代理, 更不知道真实的ip
注 
    - 3.7版本以后 代理IP的使用方法为:proxies={'http':'http://代理地址'  https同理}

Day5

异步爬虫 (梨视频网站爬取 (CSDN搜索用户  [ 25 ' h],我已完成,有详细讲解21年7月)
(注;视频对应动态刷新为ajax请求,且可能存在反扒机制(偷换网页连接中的数值),需要从主页面中获取数值id,再发送一个ajax请求,
并且这个ajax请求需要主页面中获取的数值id (携带随机参数的可以用random.random(),来获取)并且,headers中需要加上(Referer : 本页面链接)


   方式
          - 多线程,多进程(不建议使用)
             好处:可以为相关阻塞的操作单独开启线程或进程,阻塞操作就可以异步执行
             弊端:无法无限制的开启多线程或多进程 (一个进程可以有多个线程)进程可以看作火车,线程可以看作一节节的车厢,线程不能脱离进程存在,后续还有协程等概念 
          - 进程池,线程池(适当使用)
             好处:可以降低系统对进程或者线程创建和销毁的一个频率。
             弊端:池中线程或者进程的数量是有上限的
             二者的不同之处就是前者应用于线程后者主要应用于进程,而它们实现并行化操作的关键则是map函数。
             弹幕:multprocessing 是进程库,thread才是线程库

https://video.pearvideo.com/mp4/third/20220715/cont-1767555-13186476-154718-hd.mp4
https://video.pearvideo.com/mp4/third/20220715/1657941718345-13186476-154718-hd.mp4

'mrd': str(random.random())
'Referer': 'https://www.pearvideo.com/video_' + id_

https://video.pearvideo.com/mp4/third/20220715/cont-1767518-12033417-100958-hd.mp4
https://video.pearvideo.com/mp4/third/20220715/con-1767518-12033417-100958-hd.mp4

携程 (反复横跳)

 - greelet.早期模块
 - yield关键字
 - asyncio装饰器(>=3.4)
 - async, await关键字(推荐)


事件循环
# 生成一个事件循环
loop = asyncio.get_event_loop()  (死循环)

# 将任务放到任务列表
loop.run_until_complete(任务))

完整笔记及代码实现私
 

你可能感兴趣的:(爬虫,python)