爬虫(三) 复杂get请求,Handel处理器的使用

1.较为复杂的get请求:

有时候当我们需要爬取不止一页网页的数据时,可能需要在每一页请求数据时在终端输入需要的信息,以此来实现爬虫过程中不同url的需求。

下面是一个爬取贴吧的代码示例,能够爬取用户指定吧名和指定页数范围的内容。

import urllib.request
import urllib.parse
import os

# 全部url共同的部分
url = 'http://tieba.baidu.com/f?ie=utf-8&'

# 从终端读取吧名
ba_name = input("请输入您要查找的吧名:")
# 从终端读取起始页数
start_page = int(input("请输入您要查找的起始页数"))
# 从终端读取结束页数
end_page = int(input("请输入您要查找的结束页数"))

# 验证是否存在ba_name文件夹,不存在则创建文件夹
if not os.path.exists(ba_name):
    os.mkdir(ba_name)

# 在循环中依次爬取每一页的数据
for page in range(start_page, end_page + 1):
    # 利用page这个当前页拼接url的过程
    data = {
        'kw': ba_name,
        'pn': (page - 1) * 50,
    }
    data = urllib.parse.urlencode(data)
    url_t = url + data
    print(url_t)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
                      'AppleWebKit/537.36 (KHTML, like Gecko)'
                      ' Chrome/63.0.3239.132 Safari/537.36',
    }
    # 构造请求对象
    url_t = urllib.request.Request(url_t, headers=headers)
    print("第%s页开始下载......" % page)
    # 构造响应对象
    response = urllib.request.urlopen(url_t)
    # 构造文件名
    filename = ba_name + '_' + str(page) + '.html'
    # 构造文件存储路径
    filepath = ba_name + '/' + filename

    # 创建文件
    with open(filepath, 'wb') as fp:
        fp.write(response.read())
    print("第%s页下载完毕......" % page)

2. Handler 处理器的使用

handler处理器同样可以发送请求获取响应,但是Handler具有一些高级功能,例如使用代理和cookie等

(一)基本使用方法:

  1. 创建一个handler对象。
  2. 同股票handler创建一个opener对象,可以利用opener直接发送请求。
  3. 利用Rquest创建请求对象。
  4. 最后通过opener和请求对象获取响应。

下面代码是handler的基本使用方法:

import urllib.request
import urllib.parse

url = 'https://www.baidu.com/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko)'
                  ' Chrome/63.0.3239.132 Safari/537.36',
}

# 创建一个handler
handler = urllib.request.HTTPHandler()
# 通过handler创建一个opener
# opener是一个对象,可以利用opener直接发送请求
opener = urllib.request.build_opener(handler)

# 构建请求对象
request = urllib.request.Request(url, headers=headers)
# 发送请求
response = opener.open(request)

print(response.read().decode())

(二)代理高级用法:

代理:及帮忙做的中介
        正向代理:代理客户端获取数据
        反向代理:代理服务端提供数据

配置:
        浏览器配置(以谷歌浏览器为例)
            右边三点==》 设置==》 高级==》代理 ==》局域网设置 ==》 为LAN使用代理==》 输入ip和端口号即可
        代码配置
        handler = urllib.request.ProxyHandler({'http': '114.215.95.188:3128'})

步骤:

  1. 第一步也是最重要的一步:利用代理IP地址创建handler。
  2. 利用Handler创建opener。
  3. 建立请求,获取相应。

下面是相关的实例代码:

import urllib.request
import urllib.parse

# 通过代理的IP地址创建handler
handler = urllib.request.ProxyHandler({'http': '114.215.95.188:3128'})
# 常见opener
opener = urllib.request.build_opener(handler)

url = 'https://www.baidu.com/s?wd=ip&rsv_spt=1&rsv_iqid=0xcdbe4c330001a013&issp=1&f=3&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_' \
      'enter=1&oq=%25E8%258A%25B1%25E5%2588%25BA%25E4%25BB%25A3%25E7%2590%2586%25E9%25AA%258C%25E8%25AF%2581&input' \
      'T=1238&rsv_t=8eb6BXF148ag8vmsaZ3CuOANm3QvA42z7GawNIHYwu0GaXuOB531V20rNme0okakZFsw&rsv_pq=d23d080500020f17&rsv_sug3=' \
      '28&rsv_sug1=22&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1238'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko)'
                  ' Chrome/63.0.3239.132 Safari/537.36',
}
request = urllib.request.Request(url, headers=headers)
response = opener.open(request)

print(response.read().decode())
with open('ip.html', 'w') as fp:
    fp.write(response.read().decode())

(三)cookie高级用法:

cookie是什么? http 协议是无状态的     网站登录时候的问题,可以简单的认为是用来记录身份信息的,相当于给用户的一套身份证。

模拟登录 (使用cookie进行模拟登陆)

重点:在合适的请求响应中获取cookie,一般在点击涉及用户信息的请求中可以获取用户的cookie。

如果不适用Handler处理器,用一般的请求也可以在请求头部中写入cookie信息获取请求头,这种方法必须在浏览器发送请求时利用抓包工具抓取详细的cookie信息。

下面是不使用handler处理器进行的代码操作:

import urllib.request
import urllib.parse

url = 'http://www.renren.com/969499615/profile'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
    'Cookie': 'anonymid=jr3mavy6-2yhg7z; depovince=ZGQT; _r01_=1; _ga=GA1.2.1316689756.1547911144; _'
              'gid=GA1.2.1818004214.1547911144; JSESSIONID=abcrFAr_Sa7fPe-QRsPHw; ick_login=39446524-'
              '260f-4714-a3d6-8bdb9ff6a681; wp_fold=0; ick=5535a436-9f63-4ed5-94ce-0174d2c49a68; jebec'
              'ookies=3ff6473a-f7f1-4105-8c9d-74715ff4c090|||||; _de=9061F4BBA90AC7E232540B3EF7654E2A; '
              'p=e4a38e1cefd35bd2e1bb5e462b25d9265; first_login_flag=1; ln_uact=15521093428; ln_hurl=ht'
              'tp://head.xiaonei.com/photos/0/0/men_main.gif; t=bdb9b7e1fe466769655943e20e4384d35; socie'
              'tyguester=bdb9b7e1fe466769655943e20e4384d35; id=969499615; xnsid=966de04a; ver=7.0; loginf'
              'rom=null; jebe_key=4b6c9289-4279-4d5b-a730-8bb81705b3f4%7C195f1926f11e580b33a17dd9cef3228d'
              '%7C1547959411717%7C1%7C1547959421472',
    'GET': 'http://www.renren.com/969499615/profile HTTP/1.1'
}

request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(url)

# print(response.read().decode())
# print('--'*100)
# print(response.read().decode())

with open('renrenwang1.html', 'wb') as fp:
    fp.write(response.read())

下面是使用handler处理器处理待cookie信息的请求(模拟真实的浏览器,当发生完post请求的时候,将cookie保存到代码中):

步骤:

  1. 通过cookiejar创建一个handler。
  2. 通过handler创建一个opener。
  3. 抓包获取表单数据再发送请求,这时候opener会记住cookie信息,当再次利用opener访问网站时就能顺利访问。

下面是具体的代码示例:

import urllib.request
import urllib.parse
import http.cookiejar

# 模拟真实的浏览器,当发生完post请求的时候,将cookie保存到代码中
cj = http.cookiejar.CookieJar()
# 通过 cookiejar 创建一个handler
handler = urllib.request.HTTPCookieProcessor(cj)
# 通过handler创建opener
opener = urllib.request.build_opener(handler)

post_url = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019001240179'
data = {
    'email': '15521093428',
    'icode': '',
    'origURL': 'http://www.renren.com/home',
    'domain': 'renren.com',
    'key_id': '1',
    'captcha_type': 'web_login',
    'password': '86043d5b0132f5f5d3f461d6d5ccf4d4b3b40d557828f70e8b08de02dcb01ecf',
    'rkey': '4a08d7117a9b2c2e1ad82f6c5dad748b',
    'f': 'http%3A%2F%2Fguide.renren.com%2Ffillinfonew',
}
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko)'
                  ' Chrome/63.0.3239.132 Safari/537.36',
}

data = urllib.parse.urlencode(data).encode()
request = urllib.request.Request(post_url, headers=headers)

response = opener.open(request, data=data)

url = 'http://www.renren.com/969499615/profile'

request = urllib.request.Request(url, headers=headers)
response = opener.open(request)
with open('renrenwang2.html', 'wb') as fp:
    fp.write(response.read())

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值