一起学爬虫(三)静态网页抓取_requests库

简介

  • 静态网页:纯粹HTML格式的网页,由于所有数据都呈现在HTML代码中,所以静态网页易于抓取。
  • 动态网页:使用AJAX加载,不易抓取(下次再学)。
  • requests库:在上一篇文章中已经使用过,这个库可以帮助我们轻松发出HTTP请求,步骤简单。

安装requests库

详见python中关于requests库的安装,不再赘述。

获取响应内容

  • 获取网页内容是requests的常用功能
import requests #引入requests

r = requests.get("https://www.csdn.net/") #获取信息,爬一下CSDN首页 ( ̄y▽ ̄)╭ Ohohoho.....

print("文本编码:", r.encoding) #查看服务器内容使用的编码
print("响应状态码:", r.status_code) #查看响应状态码,200表示响应成功,4xx是客户端错误,5xx是服务器错误响应
print("字符串方式的响应体:", r.text) #查看响应内容,响应内容会根据响应头部的字符编码进行解码

结果:
在这里插入图片描述

定制Requests

  • 虽然requests库里有很多可以用的函数,但是有些数据只能通过手动设置参数才能获取,比如:url、定制请求头、发送post请求、设置超时等等。

1.传递URL参数

  • 为了请求特定的数据,我们需要在URL中加入一定的字符。

网址+?+键/值,可用字典保存这些参数

import requests

key_dict = {'key1':'value1',
            'key2':'value2'}

r = requests.get('http://httpbin.org/get',params = key_dict)
print("URL已经正确编码:",r.url)
print("字符串方式的响应体:\n",r.text)

结果:
在这里插入图片描述

2.定制请求头 headers

  • 请求头headers提供了关于请求、响应或其他发送实体的信息,非常重要。
  • 如果没有指定请求头,或请求头与实际网页不一致,就可能无法返回正确结果。
  • 请求头需要用F12查看网页headers以后再填写
    使用F12看请求头:
    在这里插入图片描述
    把滚动条拉到最低端可以看到自己的浏览器头
    在这里插入图片描述
import requests

headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4128.3 Safari/537.36',
           'Host':'www.csdn.net'}
r = requests.get('https://www.csdn.net', headers = headers)
print('响应状态码:', r.status_code)

会打印出来响应状态码
在这里插入图片描述

3.发送post请求

  • 除了上面使用的get请求,我们往往还需要使用post请求来发送一些编码为表单形式的数据。
  • 举个栗子,如果在登陆的时候用get请求,我们的密码就会显示在URL中,这是很不安全的,而使用post请求就可以避免这种情况。
  • 想要实现post请求,只需要简单地传递一个字典给requests中的data参数,这个数据字典会在发出请求时自动编码为表单形式。
import requests

key_dict = {'key1':'value1',
            'key2':'value2'}
r = requests.post('https://httpbin.org/post',data = key_dict)

print(r.text)

结果:
在这里插入图片描述

  • 结果中form的值变为key_dict的值,说明post请求发送成功

超时问题

  • 有时爬虫会遇到服务器长时间不响应的问题,如果不加干预的话,爬虫就会一直等待。
  • 我们需要设置requests的timeout,让爬虫不要等得太久,如果服务器没有在规定的时间timeout内应答,就返回异常
  • timeout的单位是秒(s)
import requests

link = "https://www.csdn.net"
r = requests.get(link,timeout = 0.001) #一般情况下会把timeout设置为20左右,这里是为了让大家有个直观感受

结果会报错:

在这里插入图片描述
这个异常的意思是:连接到该网页的时间已到

实践:TOP250电影数据

  • 目标锁定:豆瓣电影榜(爬虫初学者必爬网页,感谢豆瓣,手动比心)
  • 爬取内容:TOP250电影的名称
  • 网页地址:https://movie.douban.com/top250
  • 在这个爬虫中,我们需要把请求头定制为实际浏览器的请求头

第一步 爬取全部内容

headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4128.3 Safari/537.36',
           'Host':'movie.douban.com'}
  • 鉴于我们想爬取TOP250,所以是一定会翻页的
  • 翻页之后再看url(浏览器最上方的网址那一栏),发现每多一页,网页地址的start参数就要加25–可以用一个循环实现自动翻页
import requests

def get_movies():
    headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4128.3 Safari/537.36',
               'Host':'movie.douban.com'}
    for i in range(0,10):
        link = 'https://movie.douban.com/top250?start='+str(i*25)
        r = requests.get(link, headers=headers, timeout = 10)
        print(str(i+1), "页面响应状态码:", r.status_code)
        print(r.text)
get_movies()

这就是全部HTML代码了
在这里插入图片描述

第二步 解析数据

import requests
from bs4 import BeautifulSoup

def get_movies():
    headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4128.3 Safari/537.36',
               'Host':'movie.douban.com'}
    movie_list = [] #声明电影名称列表
    for i in range(0,10):
        link = 'https://movie.douban.com/top250?start='+str(i*25)
        r = requests.get(link, headers=headers, timeout = 10)
        print(str(i+1), "页面响应状态码:", r.status_code)
        soup = BeautifulSoup(r.text,"lxml")         
        div_list = soup.find_all('div',class_='hd')
        for each in div_list:
            movie = each.a.span.text.strip()
            movie_list.append(movie)
    return movie_list

movies = get_movies()
print(movies)

结果:
在这里插入图片描述

  • 成功 (๑•̀ㅂ•́)و✧
  • 在解析网页时我们使用到了BeautifulSoup,在后边几篇文章中会为大家详细讲解

进阶:如何获取TOP250电影英文名、导演、主演、电影分类和评分?

  • 下期预告:动态网页的抓取
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值