爬虫学习----静态网页抓取

一、静态网页抓取介绍

静态网页就是纯粹HTML格式的网页,早期的网站都是由静态网页制作的,静态网页的数据比较容易获取,因为我们所需的代码都隐藏在HTML代码中。抓取静态网页,我们使用requests库,requests能够让你轻易地发送HTTP请求,这可库使用简单,功能完善。

二、获取响应内容

获取响应的内容的过程,等同于我们使用浏览器的过程,我们在浏览器中输入网址,浏览器就会向服务器请求内容,服务器返回的就是HTML代码,浏览器就会自动解析代码。而我们的网络爬虫与浏览器发送请求的过程是一样的,是通过requests向浏览器发送请求,获取请求内容。

import requests
# 发送请求,获取服务器响应内容
r = requests.get("http://www.santostang.com/")
print("文本编码:", r.encoding)
print("响应状态码:", r.status_code)
print("字符串方式的响应体:", r.text)

 

  • r.text:是服务器响应的内容,根据响应头部的字符编码进行解码
  • r.encoding:服务器内容使用的文本编码
  • r.status_code:用于检测响应的状态码,返回200,表示请求成功,4xx表示客户端错误,5xx表示服务器响应错误
  • r.content:是字节方式的响应体,会自动解码gzip和deflate编码的响应数据
  • r.json():是Requests中内置的JSON解码器 

三、定制Requests

我们使用requets发送请求获取数据,但是有些网页需要对参数进行设置才能获取需要的数据,接下来我们就设置这些参数

1. 传递URL参数

有时我们需要在URL加入一些参数,才能请求特定的数据,在URL中加入参数的形式是在问号后,以键/值的形式放在URL中,我们可以把参数保存在字典中,用params构建到URL中。

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提供了关于请求,响应或其他发送请求实体的信息。简单来说就是模拟浏览器的作用,所以请求头是必学的,那么我们怎么构建请求头呢,我们使用的是Google浏览器。可以点击鼠标右键,点击检查,然后看下图,就可以找到请求所需要的参数。

# 构建请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
    'Host': 'www.santostang.com'
}
r = requests.get("http://www.santostang.com/", headers=headers)
print("响应状态码:", r.status_code)
响应状态码: 200

3. 发送POST请求

除了get请求外,还需要发送一些编码格式为表单形式的数据,有些网站需要登录才能访问,这样我们就需要使用POST请求,我们也需要传递一个字典给Reques中的data参数。这个数据字典就会发出请求的时候自动编码为表单形式。

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

4. 超时

有时在我们发送请求的时候,服务器会长时间没有响应,这时爬虫会一直等待。造成爬虫程序没有顺利执行,可以用requests在timeout参数设定的秒数之后停止等待响应。我们设置这个秒数为0.001秒。

url = "http://www.santostang.com/"
r = requests.get(url, timeout=0.001)
ConnectTimeout: HTTPConnectionPool(host='www.santostang.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<requests.packages.urllib3.connection.HTTPConnection object at 0x000001B4FF4276D8>, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))

四、项目实例

爬取豆瓣网的top250电影名字

# 导入包
import requests
from bs4 import BeautifulSoup
# 发送请求,获取响应内容
def get_movies():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
        'Host': 'movie.douban.com'
    }
    movie_list = []
    for i in range(0, 10):
        # 构建url,发送请求
        url = "https://movie.douban.com/top250?start={}" + str(i * 25)
        r = requests.get(url, 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)

总结:本篇笔记主要学习了爬取静态网页时发送requests请求, 包括url参数的设定方法,最后,实现了一个小案例。

上一篇文章:爬虫学习----爬虫简介

下一篇文章:爬虫学习----动态网页爬取

注意:本篇学习笔记,是总结唐松老师的《Python网络爬虫从入门到实践》这本书的内容,如果想了解书中详细内容,请自行购买。

猜你喜欢

转载自blog.csdn.net/gyt15663668337/article/details/85931573