1 爬虫常用模块
1.1 requests
1.1.1 requests介绍
requests 模块是python中经常使用的用来访问网络资源的模块
1.1.2 requests安装
在命令行下通过pip安装:
pip install requests
1.1.3 requests常见用法
GET 请求
import requests
header = {
'Accept': 'application/json, text/plain, */*',
'Accept-Encoding': 'gzip, deflate, br',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36',
'Connection': 'keep-alive',
'Content-Type': 'application/json; charset=utf-8'
}
response = requests.get(url=url, headers=header)
注意:请求时应加入hearder,hearder中需包含浏览器信息,如果没有,有些网站可能会拒绝请求。
要发送POST请求,只需要把get()方法变成post(),然后传入data参数作为POST请求的数据:
response = requests.post('https://accounts.douban.com/login', data={'form_email': 'abc@example.com', 'form_password': '123456'})
requests默认使用application/x-www-form-urlencoded对POST数据编码。如果要传递JSON数据,可以直接传入json参数:
params = {'key': 'value'}
response = requests.post(url, json=params) # 内部自动序列化为JSON
把post()方法替换为put(),delete()等,就可以以PUT或DELETE方式请求资源。
除了能轻松获取响应内容外,requests对获取HTTP响应的其他信息也非常简单。例如,获取响应头:
print(response.hearders)
'''
{Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', ...}
'''
print(response.headers['Content-Type'])
# 'text/html; charset=utf-8'
1.2 selenium 模块
1.2.1 selenium介绍
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
为什么要在爬虫中使用这个测试工具,是因为requests在爬取一些不需要登录的网站或者静态网页的时候非常好用,但有些网站需要用户登录后才能获取资源。现在很多网站为了防止登录请求被抓取导致用户信息泄露,所以会用各种加密手段对用户登录请求中的参数进行加密,而requests虽然也能发送登录请求,但它无法对用户的用户名和密码进行加密,除非你清楚的知道该网站使用的加密方法是什么,自己预先处理参数,然后通过requests发送加密请求。但大部分情况我们是拿不到加密方式的,所以就得用Selenium进行模拟登录,然后获取cookie。这样后续获取其他接口资源的时候,就可以使用requests进行处理了。
1.2.2 selenium安装
在命令行下通过pip安装:
pip install selenium
1.2.3 selenium使用方法
(1)先下载安装firefox浏览器
(2)下载geckodriver
geckodriver是一个单独的HTTP服务器,它是完整的WebDriver远程实现。通过符合W3C WebDriver标准的客户端库(或客户端),您可以与geckodriver HTTP服务器进行交互。
geckodriver是用Mozilla的一种系统编程语言Rust编写的 。最重要的是,它依靠 webdriver crate 来提供HTTPD,并完成大部分编组WebDriver协议的繁重工作。geckodriver将WebDriver 命令,响应和错误转换为Marionette协议,并作为WebDriver和Marionette之间的代理 。
firefox 对geckodriver的版本是有要求的,下载时要下载与你安装的firefox兼容的版本。
(3)代码演示登录小米
# coding=utf8
import platform
import time
import json
from selenium import webdriver
from selenium.webdriver.firefox.webdriver import WebDriver
from retrying import retry
# 初始化浏览器
def get_firefox_driver() -> WebDriver:
options = webdriver.FirefoxOptions()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
# 根据不同的系统去不同的路径访问第二部下载的驱动
if platform.system() == 'Windows':
return webdriver.Firefox(executable_path='lib/geckodriver.exe', options=options)
else:
return webdriver.Firefox(executable_path='/usr/local/bin/geckodriver', options=options)
@retry
def login():
print('开始登陆,请稍等')
user_name = 'xxxxx'
password = 'xxxxx'
if (user_name is None or user_name == "") or (password is None or password == ""):
print("登录失败,用户名或密码为空")
raise Exception("登录失败,用户名或密码为空")
# 加载驱动,启动浏览器
browser = get_firefox_driver()
print('开始登陆,请稍等')
# 进入小米登录页面
browser.get(
'https://account.xiaomi.com/pass/serviceLogin?callback=https%3A%2F%2Fiot.mi.com%2Fsts%3Fsign'
'%3DfCSIXasbUHiXbFs3j8qOfufIwIw%253D%26followup%3Dhttps%253A%252F%252Fiot.mi.com%252Fcgi-op%252Fapi%252Flogin'
'%253Ffollowup%253Dhttps%25253A%25252F%25252Fiot.mi.com&sid=xiaomiiot') # 登录网址
# 等待两秒,可能会有网络延迟,或者浏览器渲染速度慢,所以这里会等待几秒,等浏览器加载完页面
time.sleep(2)
# 我们事先通过浏览器F12来确定用户名和密码输入到哪个input元素上,登录会点击哪个button,这里小米的用户名input的id是 username,密码input的id 是 password,登录按钮的id 是 login-button
browser.find_element_by_id("username").send_keys(user_name)
browser.find_element_by_id("pwd").send_keys(password)
browser.find_element_by_id("login-button").click()
# 睡眠3秒,等待登录
time.sleep(3)
# 登录完成,获取登录后的cookies
cookies = browser.get_cookies()
cookie = []
for item in cookies:
cookie.append(item["name"] + "=" + item["value"])
cookie_str = '; '.join(item for item in cookie)
# 小米登录成功后cookie中会包含 serviceToken,由此来判断是否登录成功
# 如果登录不成功,会抛出异常触发@retry 来进行重试操作
if 'serviceToken' in cookie_str:
print('登陆成功')
else:
raise Exception('iot 登录未获取serviceToken')
# 关闭浏览器的窗口
browser.close()
# 关闭浏览器
browser.quit()
注意:
browser.close() 和 browser.quit()是必须要执行的,不然未关闭的浏览器太多,会占用大量服务器资源,导致服务器卡死。但在实际应用过程中,就算加了browser.close() 和 browser.quit(),也还会出现firefox浏览器未关闭的情况,所以最好写个定时脚本,定时清理浏览器进程。
1.3 retrying 模块
1.3.1 retrying介绍
retrying模块是执行方法执行过程中出现异常抛出时,能让方法重新再执行。
通常在爬虫执行过程中,使用requests调用接口访问资源可能会因为网络问题或者cookie过期导致接口访问失败,为了保证爬虫程序的健壮性,所以使用retrying 模块使异常的方法进行重试
1.3.2 retrying安装
在命令行下通过pip安装:
pip install retrying
1.3.3 retrying常用方法
from retrying import retry
@retry
def get_product(header):
url = 'https://www.xxx.com'
response = requests.get(url=url, headers=header)
if response.status_code == 200:
return response.json()
else:
raise Exception('请求失败')
这种方法是触发异常后就一直重试,直到程序运行正常为止
from retrying import retry
# 设置最大重试次数
@retry(stop_max_attempt_number=5)
def get_product(header):
url = 'https://www.xxx.com'
response = requests.get(url=url, headers=header)
if response.status_code == 200:
return response.json()
else:
raise Exception('请求失败')
这种方法有最大重试次数,最多重试5次,超过后会抛出异常
1.4 pandas 模块
1.4.1 pandas介绍
pandas 是一个专门用于数据分析的开源 Python 库。pandas 是目前所有使用 Python 语言研究和分析数据集的专业人士在做相关统计分析和决策时都需要使用的不可或缺的工具。
pandas 库最初是由 Wes McKinney 一人于 2008 年开发设计的,2012 年,Wes McKinney 的同事 Sien Chang 加入开发工作,他们一起开发出了用于数据分析的著名开源 Python 库—— pandas。
pandas 是以 NumPy 为基础进行设计的,因此 pandas 不仅能与其他大多数模块兼容,而且还能借力 NumPy 模块强大的计算能力,因此,在数据分析中 pandas 和 NumPy 这两个模块经常是一起使用的。
另外,为了数据分析的需要,pandas 既不使用 Python 已有的内置数据结构,也不使用其他库的数据结构,而是专门设计了两种新型的数据结构。使用这两种数据结构管理与 SQL 关系数据库和 Excel 工作表具有类似特征的数据会非常方便。由于 pandas 最初是作为金融数据分析工具而开发出来的,因此,pandas 为时间序列分析提供了很好的支持。
根据开发 pandas 时提出的需求,pandas 的基本功能如下:
- 具备按轴自动或显式数据对齐功能的数据结构。这可以防止许多由于数据未对齐以及来自不同数据源(索引方式不同)的数据而导致的常见错误;
- 集成时间序列功能;
- 既能处理时间序列数据也能处理非时间序列数据的数据结构;
- 数学运算和约简(比如对某个轴求和)可以根据不同的元数据(轴编号)执行;
- 灵活处理缺失数据;
- 合并及其他出现在常见数据库(例如基于 SQL)中的关系型运算。
1.4.2 pandas安装
在命令行下通过pip安装:
pip install pandas
注意:
pandas 安装时并不是只安装pandas一个模块,它还会关联安装其他模块:

还有一点需要注意的是,如果你本地的开发环境是windows10,而且你安装完pandas后显示 numpy模块的版本是1.19.4

这时候不管你有没有引用numpy模块都是报错的

这是因为numpy 1.19.4版本在win10中有bug,所以要安装1.19.3版本的numpy
通过命令行执行:
pip install -v numpy==1.19.3
1.4.3 pandas使用方法
2 爬虫demo
详细描述一个爬虫demo,测试爬取 https://www.vmgirls.com/ 中的图片资源。
1.先在本地创建一个文件夹demo
2.项目外任意路径执行命令创建python虚拟环境
python -m venv ./demo

3.使用pycharm 打开demo,并设置python虚拟环境路径,点击File->Settings…->Project:demo->Project Interpreter->小齿轮按钮

点击show all->add->Exising environment

选择刚才创建的虚拟环境中的python.exe,点击保存

4.在demo中创建main.py,并在main.py中加入一下代码
# coding=utf8
import requests
import re
if __name__ == '__main__':
# 请求网页
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36'
}
response = requests.get('https://www.vmgirls.com/12985.html', headers=headers)
# 解析网页
html = response.text
print(html)
# 正则匹配爬取的图片地址
urls = re.findall('<a href="(.*?)" alt=".*?" title=".*?">', html)
print(urls)

这时候发现 requests 报错,在终端中执行命令安装requests包
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
5.最后运行项目,爬取的图片url就打印出来了

6.项目完成之后,需要运行命令生成requirements.txt文件
pip freeze >requirements.txt
根据这个文件,可以在后面的部署中快速的安装项目的三方依赖包
