python爬虫基础

预备知识

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

url = 请求协议+网站域名+资源的路径+参数

浏览器请求url地址:当前url对应的响应+js+css+图片—>elemennts中的内容
爬虫请求url地址:当前url对应的响应
elements的内容和爬虫获取到的url地址的响应不同,爬虫中需要以当前url地址对应的
响应为准提取数据

当前url地址对应的响应在哪里:
(1)从network中找到当前url地址,点击response
(2)在当前网页上右键显示网页源码

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

get请求和post请求的区别
get请求没有请求体,post有,get请求把数据放在url地址中
post请求常用于登录注册
post请求携带的数据量比get请求大、多,常用语传输大文本的时候

http协议之请求
1.请求行
2.请求头
user-agent(用户代理):对方服务器能够通过user-agent知道当前请求对方资源
的是什么浏览器。如果需要模拟手机版的浏览器发送请求,
对应的就需要把user-agent改成手机版。
cookie:用来存储用户信息,每次请求会被携带上发送给对方的浏览器
要获取登录后才能访问的页面
对方的服务器会通过cookie来判断我们是否是一个爬虫。
3.请求体
携带数据
get请求没有请求体
post请求有请求体
http协议之响应
1.响应头
set-cookie:对方服务器通过该字段设置cookie到本地
2.响应体:url地址对应的响应


requests

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

response的方法
response.text:该方法往往会出现乱码,出现乱码使用response.encoding=“utf-8”
response.content:获取网页的二进制字节流
response.content.decode():把相应的二进制字节流转化为str类型
response.request.url #发送请求的url地址
response.url #response响应的url地址
response.request.headers #请求头
response.headers #响应头

import requests
url = "http://baidu.com"
response = requests.get(url)
response.encoding = "utf-8" #获取网页的html字符串
print(response.text)

#print(response.content)仅仅获取网页内容,二进制字节流,需要解码
print(response.content.decode())
import requests
url = "http://fanyi.baidu.com/basetrans"
query_string = {"query": "你好""from": "zh",
                "to": "en"}
requests.post(url, data=query_string)
print(response.contend.decode())

获取网页源码的正确打开方式(通过下面三种方式一定可以获取网页的源码)
1.response.content.decode()
2.response.content.decode(“gbk”)
3.response.encoding=“utf-8” , response.text

发送带header的请求
为了模拟浏览器,获取和浏览器一模一样的内容

import requests
url = "http://fanyi.baidu.com/basetrans"
query_string = {"query": "你好""from": "zh",
                "to": "en"}
headers = {"User-Agent": "...",
           "Referer": "..."}
response = requests.post(url, data=query_string, headers=headers)
# 或 response = requests.get(url, headers=headers)
print(response.content.decode())

使用超时参数
requests.get(url, headers=headers, timeout=3)#3秒之内必须返回响应,否则报错


retrying模块与cookie相关请求

retrying模块

from retrying import retry
@retry(stop_max_attemp_number=3)
def func1():
    print("this is func1")
    raise ValueError("this is test error")
import requests
from retrying import retry
"""
专门请求url地址的方法
"""
headers = {"User-Agent": "Mozilla/5.0"}
@retry(stop_max_attempt_number=3)#让被装饰的函数反复执行三次,三次全部报错才
                                 #报错,如果有一次没抱错,就不会报错
def _parse_url(url):
    response = requests.get(url, headers=headers, timeout=5)
    return response.content.decode()

def parse_url(url):
    try:
        html_str = _parse_url(url)
    except:
        html_str = None
    return html_str

if __name__ == '__main__':
    url = "http://www.baidu.com"
    print(parse_url(url)[:100])

处理cookie相关的请求
人人网{“email”: “mr_mao_hacker@163.com”,“password”: “alarmchime”}
直接携带cookie请求url地址
1.cookie放在headers中
headers = {“User-Agent”:"…", “Cookie”:“cookie字符串”}

2.cookie字典传给cookies参数
requests.get(url, cookies=cookie_dict)

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

improt requests
#实例化session
seesion = requests.session()
#使用session发送post请求,获取对方保存在本地的cookie
post_url = "http://..."
headers = {"User-Agent":"...", "Cookie":"cookie字符串"}
post_data = {"email":"...", "password":"...."}
session.post(post_url, headers=headers, data=post_data)
#再使用session请求登录后的页面
url = "http://...."
response = session.get(url, headers=headers)
with open("renren3.html", 'w", encoding="utf-8") as f:
    f.write(response.contnet.decode())
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

H4ppyD0g

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

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

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

打赏作者

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

抵扣说明:

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

余额充值