爬虫之requests

Posted lshedward

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫之requests相关的知识,希望对你有一定的参考价值。

一、request模块介绍

1. 什么是request模块

   - python中原生的基于网络请求的模块,模拟浏览器发起请求。

2. 为什么使用request模块

   - urllib需要手动处理url编码,quote()。
   - urllib需要手动处理post请求参数。
   - cookie的代理操作比较繁琐
       1. cookie
           - 创建一个cookiejar对象
           - 创建一个handler对象
           - 创建一个openner
       2. 代理
           - 创建handler对象,代理ip和端口分装到该对象
           - 创建openner对象

3. request如何被使用

   - 安装:pip install requests
   - 使用流程:
           1. 指定URL
           2. 使用request模块发起请求
           3. 获取响应数据
           4. 进行持久化储存

3.通过5个基于request模块的爬虫项目对该模块进行系统学习和巩固

   - get请求
   - post请求
   - 基于ajax的get请求
   - 基于ajax的post请求
   - 综合项目

二、项目实战

3. 基于request模块发起一个get请求

需求:爬取搜狗首页的页面数据

import requests

# 指定url
url = https://www.sogou.com/

# 发起get请求:get方法会返回请求成功的响应对象
response = requests.get(url=url)

# 获取响应中的数据值:text可以获取响应对象中字符串形式的页面数据
page_data = response.text

# 持久化操作
with open(./sougou.html,w,encoding=utf-8) as fp:
    fp.write(page_data)

 

response对象中其他重要的属性

import requests

# 指定url
url = https://www.sogou.com/

# 发起get请求:get方法会返回请求成功的响应对象
response = requests.get(url=url)

# content获取的是response对象中二进制(byte)类型的页面数据
# print(response.content)

# 返回一个响应状态码
# print(response.status_code)

# 响应头信息
# print(response.headers)

# 获取请求的url
# print(response.url)

 

4. 携带参数的get请求方式1

import requests

url = https://www.sogou.com/web?query=周杰伦&ie=utf-8

response = requests.get(url=url)

page_text = response.text

with open(./zhou.html,w,encoding=utf-8) as fp:
    fp.write(page_text)

 

5. 携带参数的get请求方式2

import requests

url = https://www.sogou.com/web

# 将参数封装到字典中
params = {
    query:周杰伦,
    ie:utf-8,
}

requests.get(url=url,params=params)

print(response.text)

 

6. 自定义请求头信息

import requests

url = https://www.sogou.com/web

# 将参数封装到字典中
params = {
    query:周杰伦,
    ie:utf-8,
}

# 自定义请求头信息
headers =  {
     User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
}

response = requests.get(url=url,params=params,headers=headers)

print(response.status_code)

 

7. 基于requests模块发起的post请求

需求:登陆豆瓣网,获取登陆成功后的页面数据

import requests

# 1. 指定post请求的url
url = https://accounts.douban.com/login

# 封装post请求的参数
data = {
    source:movie,
    redir:https://movie.douban.com/,
    form_email:‘account,
    form_password:‘password,
    login:登陆,
}

# 自定义请求头信息
headers =  {
     User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
}

# 2. 发起post请求
response = requests.post(url=url,data=data,headers=headers)

# 3. 获取响应对象中的页面数据
page_text = response.text

# 4. 持久化操作
with open(./douban.html,w,encoding=utf-8) as fp:
    fp.write(page_text)

 

8. 基于Ajax的get请求

需求:抓取豆瓣电影上电影详情的数据

import requests

url =  https://movie.douban.com/j/chart/top_list?

# 封装ajax的get请求中携带的参数(系统自带的抓包工具下面的Query String)
params = {
    type: 13,
    interval_id: 100:90,
    action:‘‘, 
    start: 100,
    limit: 20,
}

# 自定义请求头信息
headers =  {
     User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
}


response = requests.get(url=url,params=params,headers=headers)

print(response.text)

 

9. 基于Ajax的post请求

需求:爬取肯德基城市餐厅位置数据

import requests

# 1. 指定url
post_url = http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword

# 处理post请求
data = {
    cname: ‘‘,
    pid: ‘‘,
    keyword: 北京,
    pageIndex: 1,
    pageSize: 10,
}

# 自定义请求头信息
headers =  {
     User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
}

# 2. 发起基于ajax的post请求
response = requests.post(url=post_url,headers=headers,data=data)

print(response.text)

 

总结:普通的get和post的请求一般从地址栏获取url。ajax是一个局部刷新的异步请求,我们不能从地址栏获取ajax的url,要借助抓包工具获取地址。

 

10. 综合项目实战

需求:爬取搜狗知乎某一个词条对应一定范围页码表示的页面

import requests
import os

# 创建一个文件夹
if not os.path.exists(./pages):
    os.mkdir(./pages)

word = input(enter a word:)

# 动态指定页码的范围
start_page_number = int(input(enter a start page number))
end_page_number = int(input(enter a end page nunber))

# 自定义请求头信息
headers =  {
     User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
}

# 1. 指定url:设计成一个具有通用的url
url = https://zhihu.sogou.com/zhihu
for page in range(start_page_number,end_page_number + 1):
    params =  {
        query:word,
        page:page,
        ie:utf-8,
    }
    response = requests.get(url=url,params=params,headers=headers)
    
    # 获取响应中的页面数据(指定页码(page))
    page_text = response.text
    
    # 持久化存储
    file_name = word + str(page) + .html
    file_path = pages/ + file_name
    with open(file_path,w,encoding=utf-8) as fp:
        fp.write(page_text)
        print(f第{page}页数据写入成功)

 

以上是关于爬虫之requests的主要内容,如果未能解决你的问题,请参考以下文章

爬虫之request模块

Python爬虫之request模块

Python爬虫之Requests库入门

04,Python网络爬虫之requests模块

python-爬虫之requests模块介绍(登陆github)

爬虫之Scarpy.Request