0%

爬虫通识(一)总结

知识树

通用爬虫通识(一).png

基础得不能再基础

http请求的过程

http请求的过程.png
注意:浏览器渲染出来的页面和爬虫请求的页面并不一样。为啥?因为浏览器呈现的内容,除了来自用户手动发起的url请求,还来自于一些js和css文件,这些是存在服务器的。
爬虫请求的页面和渲染出来的页面不同.png

url的形式

形式 scheme://host[:port#]/path/…/[?query-string][#anchor]

scheme:协议(例如:http, https, ftp)
host:服务器的IP地址或者域名
port:服务器的端口
path:访问资源的路径
query-string:参数,发送给http服务器的数据
anchor:锚(跳转到网页的指定锚点位置)
http://localhost:4000/file/part01/1.2.html
http://item.jd.com/11936238.html#product-detail

http请求的形式

http请求的形式.png
注意:get请求没有请求体

常见http请求头

Host (主机和端口号)
Connection (链接类型) //值为keep-alive表示这是条长连接,用于会话保持
Upgrade-Insecure-Requests (升级为HTTPS请求)
User-Agent (浏览器名称)
Accept (传输文件类型)
Referer (页面跳转处)
Accept-Encoding(文件编解码格式)
Cookie (Cookie)
x-requested-with: XMLHttpRequest (是Ajax 异步请求)

python3中的字符串

python3的字符串,分两种类型:bytes(二进制形式)、str(unicode形式)
字符串类型str和bytes.png
bytes转str.png
在ipython里面(jupyter notebook环境)unicode编码可以直接转换为汉字。
image.png

  • 应用
    爬取网上的图片,将图片保存到本地。
    脚本:
1
2
3
4
5
6
import requests

response = requests.get("https://www.liaoxuefeng.com/files/attachments/1087739342615520/l") #请求图片链接,获取响应

with open("1.png","wb") as f: #以二进制方式写入并保存图片
f.write(response.content) #将响应的二进制内容写入文件

requests模块的使用

使用模块之前,记得import requests

安装第三方模块的方法

  • pip3 install 模块名
  • pip3 install *.whl
  • 下载源码压缩包,解压缩后,进入目录,执行python setup.py install

    requests发送get请求

  • 普通请求
    1
    2
    import requests
    r = requests.get("http://www.baidu.com")
    使用requests模块发起的请求,请求头的User-Agent字段是python-requests/2.22.0,太容易被发现了!伪装指数:一颗星。
    requests库的User-Agent.png
  • 带headers的请求
    就是带上http请求头,提升伪装指数。最常用的是带上User-Agent和Cookie字段,需要定义为字典格式。
    用法:
    1
    2
    3
    import requests
    headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"}
    r = requests.get("http://www.baidu.com",headers=headers)
    现在,就伪装成正常用户的User-Agent了。
    伪装的User-Agent.png
  • 带参数的请求
    很多时候,我们需要带上参数,才获取得到想要的数据。requests模块会帮助我们的。
    image.png
    image.png
    比如我进入百度(用手机模式进行操作,手机模式通常比电脑模式更简洁),搜索【陈奕迅】,通过开发者工具,看到我输入的参数名称是word。找到这个信息和请求url,就可以模仿模拟器了~
    image.png
    把cookie也带上。
    1
    2
    3
    4
    5
    import requests
    kw = {"word":"陈奕迅"}
    headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Mobile Safari/537.36",
    "Cookie": "BIDUPSID=5B552A67F4809A696EB411EBECB153B5; PSTM=1579323194; BAIDUID=5B552A67F4809A694DD0808B6CBC1E9B:FG=1; delPer=0; BD_HOME=0; BD_UPN=12314753; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BD_CK_SAM=1; PSINO=2; H_PS_PSSID=1430_21086_30495_30501; H_PS_645EC=8327uw5uHbT5t%2BUS3ka0l7KioqlTqXRxdp1H14anTPhYbz0M8Z9bBpMQA0E; WWW_ST=1579323229822"}
    r = requests.get("https://www.baidu.com/s",params=kw,headers=headers)
    现在服务器就被骗啦~~
    image.png

    requests发送post请求

    用法:data是字典格式。
    1
    response = requests.post("http://www.baidu.com/",data=data,headers=headers)
  • 模拟浏览器发送post请求,以百度翻译为例。
    进入手机模式,观察请求发送的特征。我点击【翻译】,浏览器发了两条post请求。
    • 检测输入的语言
      image.png
    • 将输入内容翻译为英文
      image.png

先做个简单的,就模拟第二条post请求,将【下雨了】翻译成英文。
post是这样的,把这部分内容做成字典格式,就可以开始写代码了。
image.png
遇到了问题,暂时按下不表,等会儿集中完成爬虫练习。这里是需要用python代码实现一个翻译小工具。

做出来啦

使用代理发送请求

get和post都可以用代理发送请求。这个伪装手段就是隐藏自己的真实IP,相当于改名行走江湖的人。
proxies也是字典格式。代理IP到网上找,一般使用高匿代理。比如这里有代理IP
举例:

1
2
3
4
5
proxies = { 
"http": "http://IP:port",
"https": "https://IP:port",
}
requests.get("http://www.baidu.com", proxies = proxies)

用法很简单,定义proxies字典之后,在requests中添加参数proxies就行了。
image.png

使用session获取登录后的页面

为了获取登录之后的页面,我们必须发送带有cookies的请求。
用法:

  • 实例化一个session对象
  • 让session发送get或者post请求
1
2
session = requests.session()
response = session.get(url,headers)

实例练习

requests使用的小技巧

  • 把cookie对象转化为字典
    requests.utils.dict_from_cookiejar(cookies对象)
  • 请求SSL证书无效的网站
    response = requests.get("https://www.12306.cn/mormhweb/ ",verify=False)
  • 设置超时
    response = requests.get(url,timeout=10)
  • 配合状态码判断是否请求成功
    assert就是下断言,预先判定认为条件成立。就像你买彩票,假定自己会中奖。
    assert response.status_code == 200

在这里练习的


实例操作,先放一下,休息一会儿继续。就另写几篇,一个实验写一篇,包括实验过程和总结。

-------------本文结束感谢您的阅读-------------