爬虫

·# 爬虫概念、工具和Http

1. 什么是爬虫

  • 爬虫就是***模拟客户端(浏览器)发送网络请求***,获取响应,按照规则提取数据的程序
  • 模拟客户端(浏览器)发送网络请求:照着浏览器发送一摸一样的请求,获取和浏览器一模一样的数据

2. 爬虫的数据去哪了

  • 呈现出来:展示在网页上,或者展示在app上
  • 进行分析:从数据中寻找一些规律

3. 需要的软件和环境

  • python3(函数,面向对象)
  • pycharm
  • chrome浏览器
    • 分析网络请求用的

4. 浏览器的请求

  • url
    • 在chrome打开开发者面板,找到network,可以用url解码解解出来
    • url = 请求的协议 + 网站的域名 + 资源的路径 + 参数
  • 浏览器请求url地址
    • 爬虫不能把得到的js和css渲染到一起,无法组成elements
    • 当前url对应的响应+js+css+图片–》elements中的内容
  • 爬虫请求url地址
    • 当前url对应的响应
  • elements的内容和爬虫获取的url地址的响应不同,爬虫需要以当前url地址对应的响应为准提取数据
  • 当前url地址对应的响应
    • 从network中找到当前url的地址,点击response
    • 在页面上显示网页源码

5. 认识HTTP,HTTPS

  • HTTP:超文本传输协议
    • 以明文的形式传输,
    • 效率更高,但是不安全
  • HTTPS:HTTP + SSL(安全套接字层)
    • 传输之前,数据先加密,之后解密,获取内容
    • 效率较低,但是安全

requests模块的学习

使用前

- pip install requests

发送get,post请求,获取响应

  • response = request.get(url):发送get请求,获取url地址对应的响应
  • response = request.post(url, data={请求体的字典}):发送post请求,获取url地址对应的响应

response的方法

  • response.text属性,response.text
    • 该方式通常会乱码,出现乱码使用

获取网页的html字符串
response.encoding = ‘utf-8’
解码用decode()方法

  • response.content.decode():把响应的二进制字节流转换为str类型
  • response.request.url:发送请求的url地址
  • response.url:response响应的url地址
  • response.request.headers:请求头
  • response.headers:响应请求

获取网页源码的正确打开方式(通过下面三种方式一定能获得正确解码后网页的字符串)

  1. response.content.decode()
  2. response.content.decode(“gbk”)
  3. response.text

get 和 post请求皆可使用
有时response得不到数据,是因为服务器已经知道我们是个爬虫,就不给我们数据了
带上header就行

发送带header的请求

为了模拟浏览器更像,获取和浏览器一模一样的内容

  • headers = {里面放参数,键值对要放好}

一般用User-Agent就行了,不行的话就把其他的属性带上,最后再不行就带上cookie

使用超时参数

强制返回响应,在指定的时间内

  • requests.get(url, headers=headers, tiemout=3):3秒内必须返回响应,否则会报错

retrying模块学习

from retrying inport retry

@retry(stop_max_attempt_number=3)//执行三次,三次错误后才报错,三次内成功则往下走
def fun1():
	print("this is func1")
	rasie ValueError('this is test error')

处理cookie相关的请求

在这里插入图片描述

  • 直接携带cookie访问url地址
  1. cookie直接放在header

    headers={'User-Agent':'...',"cookie":'cookie 字符串'}
    
  2. cookie字典可以传给cookies参数

    cookie_dict={i.split('=')[0]: i.split("=")[-1]for i in cookie.split(';')} 
    response.get(url, cookies=cookie_dict)
    
  • 先发送post请求,获取cookie,带上cookie请求登录后的页面

      1. session = requests.session()# session具有的方法和requests一样
      2. session.post(url, data, headers)# 服务器设置在本地的cookie会存在sesssion
      3. session.get(url) #会带上之前保存在session中的cookie,能够请求成功
    

数据提取方法

json

数据交换格式,看起来像是python类型(列表,字典)的字符串
使用前,先导入:import json

json.loads

把json字符串转换为python类型
json.loads(json字符串)

dict_ret = json.loads(html_str)
print(type(dict_ret))# dict

json.dumps

把python类型转化为json字符串
json.dumps{‘a’:‘aa’,‘b’:‘bb’}
json.dumps(字典,ensure_ascii=False) # 表示不用ascii码保存,显示出中文
json.dumps(字典,ensure_ascii=False,indent=2) # 在下一行在上一行的基础上空两格

哪里会返回json的数据

  • 浏览器切换到手机版
  • 抓包app

豆瓣爬虫案例

Referer字段对于防止爬取数据很有用

xpath和lxml

xpath

一门从html中提取数据的语言,有xpath helper插件:可以帮我们从elements中定位数据

使用
  1. 选择节点(标签):/html/head/meta:选择html下的head的所有meta标签
  2. 选择当前节点(标签):
    2-1. //:能都从任意节点开始选择*** ,可以跟/连用
    2-2. //li:选择所有li标签
  3. @符号的用处
  4. 定位元素://div[@class='属性值']/ul/li:获得属性值为指定的div下的ul下的li
  5. []用于修饰,单写@+属性是获得属性值:/a/@href:获取href里的文本
  6. text():获取标签包裹的文本:/a/text():获取a标签里的文本。/a//text():获取a标签下的所有文本

lxml

安装

pip install lxml

使用

不能在element里写,要在源码里写

from lxml import etree
element = etree.HTML('html字符串') # 转化为一个element对象,element才能使用xpath语法
list = element.xpath('语法') # 返回一个列表
element = hrml_str.xpath('div/table') # 如果取到的不是字符串,而是一个标签,就会变成一个element对象

三元运算符

a = 10 if 4>3 else 20 # 10
a = 10 if 4<3 else 20 # 20
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值