Python 爬虫实战(二):使用 requests-html

Python 爬虫实战(一):使用 requests 和 BeautifulSoup,我们使用了 requests 做网络请求,拿到网页数据再用 BeautifulSoup 解析,就在前不久,requests 作者 kennethreitz 出了一个新库 requests-html,Pythonic HTML Parsing for Humans™,它可以用于解析 HTML 文档的。requests-html 是基于现有的框架 PyQuery、Requests、lxml 等库进行了二次封装,更加方便开发者调用。

Python 基础

我之前写的《Python 3 极简教程.pdf》,适合有点编程基础的快速入门,通过该系列文章学习,能够独立完成接口的编写,写写小东西没问题。

安装

金沙官网线上,Mac:

pip3 install requests-html

Windows:

pip install requests-html

requests

requests,Python HTTP 请求库,相当于 Android 的 Retrofit,它的功能包括 Keep-Alive 和连接池、Cookie 持久化、内容自动解压、HTTP 代理、SSL 认证、连接超时、Session 等很多特性,同时兼容 Python2 和 Python3,GitHub:https://github.com/requests/requests

实例

金沙官网线上 1

代码撸多了,让我们看会妹纸,爬的网站我选的是 http://www.win4000.com/zt/xinggan.html ,打开网站,观察到这是个列表,图片是缩略图,要想保存图片到本地,当然需要高清大图,因此得进入列表详情,进一步解析,完整代码如下:

from requests_html import HTMLSession
import requests
import time

session = HTMLSession()


# 解析图片列表
def get_girl_list():
    # 返回一个 response 对象
    response = session.get('http://www.win4000.com/zt/xinggan.html')  # 单位秒数

    content = response.html.find('div.Left_bar', first=True)

    li_list = content.find('li')

    for li in li_list:
        url = li.find('a', first=True).attrs['href']
        get_girl_detail(url)


# 解析图片详细
def get_girl_detail(url):
    # 返回一个 response 对象
    response = session.get(url)  # 单位秒数
    content = response.html.find('div.scroll-img-cont', first=True)
    li_list = content.find('li')
    for li in li_list:
        img_url = li.find('img', first=True).attrs['data-original']
        img_url = img_url[0:img_url.find('_')] + '.jpg'
        print(img_url + '.jpg')
        save_image(img_url)


# 保持大图
def save_image(img_url):
    img_response = requests.get(img_url)
    t = int(round(time.time() * 1000))  # 毫秒级时间戳
    f = open('/Users/wuxiaolong/Desktop/Girl/%d.jpg' % t, 'ab')  # 存储图片,多媒体文件需要参数b(二进制文件)
    f.write(img_response.content)  # 多媒体存储content
    f.close()


if __name__ == '__main__':
    get_girl_list()

代码就这么多,是不是感觉很简单啊。

说明:

1、requests-html 与 BeautifulSoup 不同,可以直接通过标签来 find,一般如下:
标签
标签.someClass
标签#someID
标签[target=_blank]
参数 first 是 True,表示只返回 Element 找到的第一个,更多使用:http://html.python-requests.org/

2、这里保存本地路径 /Users/wuxiaolong/Desktop/Girl/我写死了,需要读者改成自己的,如果直接是文件名,保存路径将是项目目录下。

安装

Mac:

pip3 install requests

Windows:

pip install requests

遗留问题

示例所爬网站是分页的,没有做,可以定时循环来爬妹纸哦,有兴趣的读者自己玩下。

发送请求

HTTP 请求方法有 get、post、put、delete。

import requests

# get 请求
response = requests.get('http://127.0.0.1:1024/developer/api/v1.0/all')

# post 请求
response = requests.post('http://127.0.0.1:1024/developer/api/v1.0/insert')

# put 请求
response = requests.put('http://127.0.0.1:1024/developer/api/v1.0/update')

# delete 请求
response = requests.delete('http://127.0.0.1:1024/developer/api/v1.0/delete')

请求返回 Response 对象,Response 对象是对 HTTP 协议中服务端返回给浏览器的响应数据的封装,响应的中的主要元素包括:状态码、原因短语、响应首部、响应 URL、响应 encoding、响应体等等。

# 状态码
print(response.status_code)

# 响应 URL
print(response.url)

# 响应短语
print(response.reason)

# 响应内容
print(response.json())

参考

requests-html

今天用了一下Requests-HTML库(Python爬虫)

定制请求头

请求添加 HTTP 头部 Headers,只要传递一个 dict 给 headers 关键字参数就可以了。

header = {'Application-Id': '19869a66c6',
          'Content-Type': 'application/json'
          }
response = requests.get('http://127.0.0.1:1024/developer/api/v1.0/all/', headers=header)

公众号

我的公众号:吴小龙同学,欢迎交流~
金沙官网线上 2

构建查询参数

想为 URL 的查询字符串(query string)传递某种数据,比如:http://127.0.0.1:1024/developer/api/v1.0/all?key1=value1&key2=value2 ,Requests 允许你使用 params 关键字参数,以一个字符串字典来提供这些参数。

payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.get("http://127.0.0.1:1024/developer/api/v1.0/all", params=payload)

还可以将 list 作为值传入:

payload = {'key1': 'value1', 'key2': ['value2', 'value3']}
response = requests.get("http://127.0.0.1:1024/developer/api/v1.0/all", params=payload)

# 响应 URL
print(response.url)# 打印:http://127.0.0.1:1024/developer/api/v1.0/all?key1=value1&key2=value2&key2=value3

post 请求数据

如果服务器要求发送的数据是表单数据,则可以指定关键字参数 data。

payload = {'key1': 'value1', 'key2': 'value2'}
response = requests.post("http://127.0.0.1:1024/developer/api/v1.0/insert", data=payload)

如果要求传递 json 格式字符串参数,则可以使用 json 关键字参数,参数的值都可以字典的形式传过去。

obj = {
    "article_title": "小公务员之死2"
}
# response = requests.post('http://127.0.0.1:1024/developer/api/v1.0/insert', json=obj)

响应内容

Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。

# 响应内容
# 返回是 是 str 类型内容
# print(response.text())
# 返回是 JSON 响应内容
print(response.json())
# 返回是二进制响应内容
# print(response.content())
# 原始响应内容,初始请求中设置了 stream=True
# response = requests.get('http://127.0.0.1:1024/developer/api/v1.0/all', stream=True)
# print(response.raw())

超时

如果没有显式指定了 timeout 值,requests 是不会自动进行超时处理的。如果遇到服务器没有响应的情况时,整个应用程序一直处于阻塞状态而没法处理其他请求。

response = requests.get('http://127.0.0.1:1024/developer/api/v1.0/all', timeout=5)  # 单位秒数

代理设置

如果频繁访问一个网站,很容易被服务器屏蔽掉,requests 完美支持代理。

# 代理
proxies = {
    'http': 'http://127.0.0.1:1024',
    'https': 'http://127.0.0.1:4000',
}
response = requests.get('http://127.0.0.1:1024/developer/api/v1.0/all', proxies=proxies)

BeautifulSoup

BeautifulSoup,Python Html 解析库,相当于 Java 的 jsoup。

安装

BeautifulSoup 3 目前已经停止开发,直接使用BeautifulSoup 4。

Mac:

pip3 install beautifulsoup4

Windows:

pip install beautifulsoup4

安装解析器

我用的是 html5lib,纯 Python 实现的。

Mac:

pip3 install html5lib

Windows:

pip install html5lib

简单使用

BeautifulSoup 将复杂 HTML 文档转换成一个复杂的树形结构,每个节点都是 Python 对象。

本文由金沙官网线上发布于编程,转载请注明出处:Python 爬虫实战(二):使用 requests-html

您可能还会对下面的文章感兴趣: