您当前的位置:首页 > 计算机 > 编程开发 > Python

【Python爬虫】你还在纠结选择哪个爬虫库嘛,全都拿来吧你

时间:04-22来源:作者:点击数:

你学过爬虫吗,你用过这些爬虫库吗,这些都是非(大型框架、驱动浏览器和分布式)的爬虫库。

😆获取数据部分

🚗requests

看到目录,爬虫初学者可能只认识这个库,因为他是使用最多的爬虫库,也是最常见的爬虫库。

requests是用Python编写的、基于urllib3、采用Apache2 Licensed开源协议的HTTP库。它比urllib更方便,可以节约我们大量的工作,完全满足日常HTTP测试需求。

使用pip install requests即可安装此库,像如图一样显示Successfully就说明安装成功了。

安装requests库

先将本章需要的第三方库、网址、请求头等准备好:

import sys
import you_get
import requests
from requests import utils
from autoscraper import AutoScraper
from urllib import request, parse
url = 'http://110.42.181.215:8866'  # 炸飞机双人小游戏在线玩
url2 = 'http://110.42.181.215:6699/login'  # 自动应答表单(测试用)
url3 = 'https://www.bilibili.com/video/BV1Em4y1R7Sz?t=40.8'  # 有人一生被童年治愈,有人用一生来治愈童年(bilibili视频)
url4 = 'https://www.csdn.net'  # C站官网(用于爬取热点)
cookies = ''
# 常见的请求头是用户代理User-Agent、目的地(域名+端口号)Host、站点(协议+域名+端口)Origin、原始资源网址(协议+域名+路径+查询参数)Referer
headers = {
    'Cookie': cookies,
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}

普通的访问网站,会返回一个Response对象和状态码:

res = requests.get(url, headers=headers, cookies=cookies_dict)
res返回:<Response [200]>

使用会话维持访问网站(适合需要登录或者网站跳转会设置cookie的网站),也返回一个Response对象和状态码:

session = requests.session()  # 能建立连接池,会自动保存管理cookie等值
utils.add_dict_to_cookiejar(session.cookies, cookies_dict)  # 将自定义的cookie字典添加到session会话中
res = session.get(url, headers=headers, cookies=cookies_dict)
res返回:<Response [200]>

Response对象作为相应对象,有很多属性:

# 网页是否成功访问,返回 [True, False]
>>> res.ok
True
# 网页返回的状态码,返回 [100, ..., 200, ..., 300, ..., 400, ..., 500, ...]
>>> res.status_code
200
# 网页的请求头字典
>>> res.headers
{'Content-Type': 'text/html; charset=utf-8', 'Content-Length': '2647', 'Server': 'Werkzeug/1.0.1 Python/3.7.9', 'Date': 'Tue, 15 Mar 2022 13:21:02 GMT'}
# 网页的cookie值,以RequestsCookieJar类的方式保存
>>> res.cookies
<RequestsCookieJar[]>
# 网页的地址(有的网页会发生跳转,可能会和初始访问地址不同)
>>> res.url
'http://110.42.181.215:8866/'
# 返回从header的charset字段中提取的编码方式(猜测),默认为ISO-8859-1(无法解析中文),可以被赋值
>>> res.encoding
'utf-8'
# 从网页内容中分析网页编码的方式(比res.encoding更准确)
>>> res.apparent_encoding
'utf-8'
# 返回网页的源数据(字节)内容,下载媒体资源时会用到
>>> res.content
b'<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset="utf-8">\n\t\t<title>\xe7\x82\xb8\xe9\xa3\x9e\xe6\x9c\xba\xe5\x8f\x8c\xe4\xba\xba\xe5\xb0\x8f\xe6\xb8\xb8\xe6\x88\x8f\xe5\x9c\xa8\xe7\xba\xbf\xe7\x8e\xa9</title>\n\t\t<link rel="stylesheet" href="static/sky.css" />\n\t\t<script src="static/play.js"></script>\n\t</head>\n\t<body οnlοad="">\n\t\t<center class="outer">\n\t\t\t<div class="title">\n\t\t\t\t<h2>\xe7\x82\xb8\xe9\xa3\x9e\xe6\x9c\xba\xe5\x8f\x8c\xe4\xba\xba\xe5\xb0\x8f\xe6\xb8\xb8\xe6\x88\x8f\xe5\x9c\xa8\xe7\xba\xbf\xe7\x8e\xa9</h2>\n\t\t\t</div>\n\t\t\t<div class="sky left">\n\t\t\t\t<center>\xe6\x88\x91\xe6\x96\xb9\xe9\xa3\x9e\xe6\x9c\xba\xe5\x8c\xba\xe5\x9f\x9f</center>\n\t\t\t\t<div id="left" οndrοp="drop(event)" οndragοver="allowDrop(event)"></div>\n\t\t\t</div>\n\t\t\t<div class="sky right">\n\t\t\t\t<center>\xe6\x95\x8c\xe6\x96\xb9\xe9\xa3\x9e\xe6\x9c\xba\xe5\x8c\xba\xe5\x9f\x9f</center>\n\t\t\t\t<div id="right"></div>\n\t\t\t</div>\n\t\t</center>\n\t\t<div id="plans" style="">\n\t\t\t<div id="plan1" draggable="true" οndragstart="drag(event)" οndblclick="set_direction(\'plan1\')"></div>\n\t\t\t<div id="plan2" draggable="true" οndragstart="drag(event)" οndblclick="set_direction(\'plan2\')"></div>\n\t\t\t<div id="plan3" draggable="true" οndragstart="drag(event)" οndblclick="set_direction(\'plan3\')"></div>\n\t\t</div>\n\t\t<div class="tip">\n\t\t\t<h3>\xe6\xb8\xb8\xe6\x88\x8f\xe8\xaf\xb4\xe6\x98\x8e\xef\xbc\x9a</h3>\n\t\t\t<p>1\xe3\x80\x81\xe7\x82\xb9\xe5\x87\xbb\xe5\x88\x9b\xe5\xbb\xba\xe6\x88\xbf\xe9\x97\xb4\xe8\x8e\xb7\xe5\x8f\x96\xe6\x88\xbf\xe9\x97\xb4\xe5\x8f\xb7\xef\xbc\x8c\xe9\x82\x80\xe8\xaf\xb7\xe5\x8f\xa6\xe4\xb8\x80\xe5\x8d\x8a\xe8\xbe\x93\xe5\x85\xa5\xe6\x88\xbf\xe9\x97\xb4\xe5\x8f\xb7\xe5\x8d\xb3\xe5\x8f\xaf\xe5\x8a\xa0\xe5\x85\xa5\xe6\x88\xbf\xe9\x97\xb4\xe3\x80\x82</p>\n\t\t\t<p>2\xe3\x80\x81\xe5\xa6\x82\xe6\x9e\x9c\xe7\x94\xb5\xe8\x84\x91\xe5\xb1\x8f\xe5\xb9\x95\xe5\x88\x86\xe8\xbe\xa8\xe7\x8e\x87\xe8\xbe\x83\xe4\xbd\x8e\xef\xbc\x8c\xe5\x8f\xaf\xe4\xbb\xa5\xe6\x8c\x89\xe4\xbd\x8f Ctrl \xe5\x92\x8c\xe9\xbc\xa0\xe6\xa0\x87\xe6\xbb\x9a\xe8\xbd\xae\xe8\xb0\x83\xe6\x95\xb4\xe7\xbc\xa9\xe6\x94\xbe\xef\xbc\x8c\xe6\x8e\xa8\xe8\x8d\x90\xe4\xbd\xbf\xe7\x94\xa8<b><span style="color: red;">1920x1080</span></b>\xe5\x88\x86\xe8\xbe\xa8\xe7\x8e\x87\xe3\x80\x82</p>\n\t\t\t<p>3\xe3\x80\x81\xe5\xa6\x82\xe6\x9e\x9c\xe5\x87\xbb\xe4\xb8\xad\xe6\x95\x8c\xe6\x96\xb9\xe9\xa3\x9e\xe6\x9c\xba\xe5\x88\x99\xe6\x96\xb9\xe5\x9d\x97\xe5\x8f\x98\xe7\xba\xa2\xef\xbc\x8c\xe5\x90\xa6\xe5\x88\x99\xe6\x96\xb9\xe5\x9d\x97\xe5\x8f\x98\xe7\x99\xbd\xef\xbc\x9b\xe5\x87\xbb\xe4\xb8\xad\xe9\xa3\x9e\xe6\x9c\xba\xe6\xa0\xb8\xe5\xbf\x83\xef\xbc\x88\xe7\xba\xa2\xe8\x89\xb2\xe8\x99\x9a\xe7\xba\xbf\xef\xbc\x89\xe5\x88\x99\xe6\x95\xb4\xe4\xb8\xaa\xe9\xa3\x9e\xe6\x9c\xba\xe9\x83\xbd\xe4\xbc\x9a\xe6\x98\xbe\xe7\xa4\xba\xe4\xb8\x94\xe5\x8f\x98\xe7\x81\xb0\xef\xbc\x88\xe4\xbb\xa3\xe8\xa1\xa8\xe5\xb7\xb2\xe8\xa2\xab\xe5\x87\xbb\xe6\xaf\x81\xef\xbc\x89\xef\xbc\x8c\xe6\xaf\x94\xe8\xb0\x81\xe8\x83\xbd\xe6\x9b\xb4\xe5\xbf\xab\xe5\x87\xbb\xe6\xaf\x81\xe5\xaf\xb9\xe6\x96\xb9\xe4\xb8\x89\xe6\x9e\xb6\xe9\xa3\x9e\xe6\x9c\xba\xe5\x90\xa7~</p>\n\t\t\t<p>4\xe3\x80\x81\xe6\xaf\x8f\xe4\xb8\xaa\xe4\xba\xba\xe9\x83\xbd\xe8\xa6\x81\xe6\x94\xbe\xe7\xbd\xae3\xe6\x9e\xb6\xe9\xa3\x9e\xe6\x9c\xba\xef\xbc\x8c\xe4\xb8\x80\xe6\x97\xa6\xe6\x94\xbe\xe4\xb8\x8b\xe4\xb8\x8d\xe5\x8f\xaf\xe6\x9b\xb4\xe6\x94\xb9\xef\xbc\x8c\xe6\x8b\x96\xe5\x8a\xa8\xe5\x88\xb0\xe6\x88\x91\xe6\x96\xb9\xe9\xa3\x9e\xe6\x9c\xba\xe5\x8c\xba\xe5\x9f\x9f\xef\xbc\x88\xe5\xb7\xa6\xef\xbc\x89\xe5\x86\x85\xe5\x8d\xb3\xe5\x8f\xaf\xef\xbc\x8c\xe5\x8f\x8c\xe5\x87\xbb\xe5\x8f\xaf\xe4\xbb\xa5\xe9\xa1\xba\xe6\x97\xb6\xe9\x92\x88\xe8\xb0\x83\xe6\x95\xb4\xe6\x96\xb9\xe5\x90\x91\xef\xbc\x8c\xe6\x8b\x96\xe5\x8a\xa8\xe6\x97\xb6\xe8\xaf\xb7\xe5\xb0\x86\xe9\xa3\x9e\xe6\x9c\xba\xe6\xa0\xb8\xe5\xbf\x83\xef\xbc\x88\xe7\xba\xa2\xe8\x89\xb2\xe8\x99\x9a\xe7\xba\xbf\xef\xbc\x89\xe5\xaf\xb9\xe5\x87\x86\xe6\x8b\x96\xe5\x8a\xa8\xe5\x90\x8e\xe7\x9a\x84\xe6\x96\xb9\xe5\x9d\x97\xe3\x80\x82</p>\n\t\t\t<p>5\xe3\x80\x81\xe6\x9c\xac\xe6\xb8\xb8\xe6\x88\x8f\xe4\xb8\xba\xe5\x9b\x9e\xe5\x90\x88\xe5\x88\xb6\xe6\xb8\xb8\xe6\x88\x8f\xef\xbc\x8c\xe5\x85\x88\xe6\x91\x86\xe6\x94\xbe\xe5\xae\x8c\xe8\x80\x85\xe5\xb0\x86\xe5\x85\x88\xe6\x89\x8b\xef\xbc\x8c\xe7\x82\xb9\xe5\x87\xbb\xe6\x95\x8c\xe6\x96\xb9\xe9\xa3\x9e\xe6\x9c\xba\xe5\x8c\xba\xe5\x9f\x9f\xef\xbc\x88\xe5\x8f\xb3\xef\xbc\x89\xe8\xbf\x9b\xe8\xa1\x8c\xe6\x94\xbb\xe5\x87\xbb\xef\xbc\x8c\xe5\x87\xbb\xe4\xb8\xad\xe9\xa3\x9e\xe6\x9c\xba\xe4\xb8\xad\xe5\xbf\x83\xef\xbc\x88\xe7\xba\xa2\xe8\x99\x9a\xe7\xba\xbf\xe8\xbe\xb9\xe6\xa1\x86\xe6\x96\xb9\xe5\x9d\x97\xef\xbc\x89\xe5\x88\x99\xe9\xa3\x9e\xe6\x9c\xba\xe7\xab\x8b\xe5\x88\xbb\xe5\x9d\xa0\xe6\xaf\x81\xef\xbc\x8c\xe5\x9d\xa0\xe6\xaf\x81\xe5\x90\x8e\xe4\xbc\x9a\xe5\x9c\xa8\xe5\x9b\xbe\xe4\xb8\xad\xe6\x98\xbe\xe7\xa4\xba\xe9\xa3\x9e\xe6\x9c\xba\xe8\xbd\xae\xe5\xbb\x93\xef\xbc\x8c\xe4\xb8\x8d\xe5\x8f\xaf\xe6\x92\xa4\xe9\x94\x80\xe6\x94\xbb\xe5\x87\xbb\xef\xbc\x8c\xe8\xaf\xb7\xe8\xb0\xa8\xe6\x85\x8e\xe6\x94\xbb\xe5\x87\xbb\xe3\x80\x82</p>\n\t\t</div>\n\t\t<div id="start", style="">\n\t\t\t<aside class="control">\n\t\t\t\t<p>\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe6\x88\xbf\xe9\x97\xb4\xe5\x8f\xb7\xe5\xbc\x80\xe5\xa7\x8b\xe6\xb8\xb8\xe6\x88\x8f<p>\n\t\t\t\t<p>\n\t\t\t\t<form id="play" method="get" action="/">\n\t\t\t\t\t<p id="room"><input type="text" name="room" placeholder="\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe6\x88\xbf\xe9\x97\xb4\xe5\x8f\xb7\xef\xbc\x884\xe4\xbd\x8d\xe6\x95\xb0\xe5\xad\x97\xef\xbc\x89" /></p>\n\t\t\t\t\t<p id="res">\n\t\t\t\t\t\t<span>\xe5\xa4\xa7\xe5\xb0\x8f\xef\xbc\x9a</span>\n\t\t\t\t\t\t<select name="size">\n\t\t\t\t\t\t\t<option value="10">10</option>\n\t\t\t\t\t\t\t<option value="12">12</option>\n\t\t\t\t\t\t\t<option value="15">15</option>\n\t\t\t\t\t\t\t<option value="20">20</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<input type="submit" value="\xe5\x8a\xa0\xe5\x85\xa5" />\n\t\t\t\t\t</p>\n\t\t\t\t</form>\n</p>\n\t\t\t\t<p><a></a></p>\n\t\t\t</aside>\n\t\t</div>\n\t\t<style></style>\n\t</body>\n</html>'
# 返回网页源代码,相当于res.content.decode(res.apparent_encoding)
>>> res.text
'<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset="utf-8">\n\t\t<title>炸飞机双人小游戏在线玩</title>\n\t\t<link rel="stylesheet" href="static/sky.css" />\n\t\t<script src="static/play.js"></script>\n\t</head>\n\t<body οnlοad="">\n\t\t<center class="outer">\n\t\t\t<div class="title">\n\t\t\t\t<h2>炸飞机双人小游戏在线玩</h2>\n\t\t\t</div>\n\t\t\t<div class="sky left">\n\t\t\t\t<center>我方飞机区域</center>\n\t\t\t\t<div id="left" οndrοp="drop(event)" οndragοver="allowDrop(event)"></div>\n\t\t\t</div>\n\t\t\t<div class="sky right">\n\t\t\t\t<center>敌方飞机区域</center>\n\t\t\t\t<div id="right"></div>\n\t\t\t</div>\n\t\t</center>\n\t\t<div id="plans" style="">\n\t\t\t<div id="plan1" draggable="true" οndragstart="drag(event)" οndblclick="set_direction(\'plan1\')"></div>\n\t\t\t<div id="plan2" draggable="true" οndragstart="drag(event)" οndblclick="set_direction(\'plan2\')"></div>\n\t\t\t<div id="plan3" draggable="true" οndragstart="drag(event)" οndblclick="set_direction(\'plan3\')"></div>\n\t\t</div>\n\t\t<div class="tip">\n\t\t\t<h3>游戏说明:</h3>\n\t\t\t<p>1、 点击创建房间获取房间号,邀请另一半输入房间号即可加入房间。</p>\n\t\t\t<p>2、如果电脑屏幕分辨率较低,可以按住 Ctrl 和鼠标滚轮调整缩放,推荐使用<b><span style="color: red;">1920x1080</span></b>分辨率。</p>\n\t\t\t<p>3、如果击中敌方飞机则方块 变红,否则方块变白;击中飞机核心(红色虚线)则整个飞机都会显示且变灰(代表已被击毁),比谁能更快击毁对方三架飞机吧~</p>\n\t\t\t<p>4、每个人都要放置3架飞机,一旦放下不可更改,拖动到我方飞机区域(左)内即可,双击可以顺时针调整方向,拖动时请将飞机核心(红色虚线)对准拖动后的方块。</p>\n\t\t\t<p>5、本游戏为回合制游戏,先摆放完者将先手,点击敌方飞机区域(右)进行攻击,击中飞机中心(红虚线边框方块)则飞机立刻坠毁,坠毁后会在图中显示飞机轮廓,不可撤销攻击,请谨慎攻击。</p>\n\t\t</div>\n\t\t<div id="start", style="">\n\t\t\t<aside class="control">\n\t\t\t\t<p>请输入房间号开始游戏<p>\n\t\t\t\t<p>\n\t\t\t\t<form id="play" method="get" action="/">\n\t\t\t\t\t<p id="room"><input type="text" name="room" placeholder="请输入 房间号(4位数字)" /></p>\n\t\t\t\t\t<p id="res">\n\t\t\t\t\t\t<span>大小:</span>\n\t\t\t\t\t\t<select name="size">\n\t\t\t\t\t\t\t<option value="10">10</option>\n\t\t\t\t\t\t\t<option value="12">12</option>\n\t\t\t\t\t\t\t<option value="15">15</option>\n\t\t\t\t\t\t\t<option value="20">20</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<input type="submit" value="加入" />\n\t\t\t\t\t</p>\n\t\t\t\t</form>\n</p>\n\t\t\t\t<p><a></a></p>\n\t\t\t</aside>\n\t\t</div>\n\t\t<style></style>\n\t</body>\n</html>'

由于我爬的网页是文本,所以暂时常用上述属性。如果我们爬到的数据是json格式(列表/字典),那么我们可以使用如下方法:

res = session.get(url2 + '?test=001', headers=headers, cookies=cookies_dict)
print(res.json())  # 返回网页的json对象,如果返回内容不是json字符串,则会抛出simplejson.errors.JSONDecodeError异常
res = session.get(url2, params={'test': '002'}, headers=headers, cookies=cookies_dict)
print(res.json())
res = session.post(url2, data={'test': '003'}, headers=headers, cookies=cookies_dict)
print(res.json())
所有返回:
{'content': {'test': '001'}, 'method': 'GET', 'res': '提交成功', 'title': '表单自动响应'}
{'content': {'test': '002'}, 'method': 'GET', 'res': '提交成功', 'title': '表单自动响应'}
{'content': {'test': '003'}, 'method': 'POST', 'res': '提交成功', 'title': '表单自动响应'}

可见get一般使用params参数,或者直接跟在url地址后面。

post一般使用data参数,用于构造请求体。

🚓you-get

这是一个类似于IDM的视频图片音乐嗅探库,不过他的嗅探范围没有IDM广,多半是F12能看到的媒体资源,下载资源挺方便的。

使用pip install you-get即可安装此库,像如图一样显示Successfully就说明安装成功了。

请添加图片描述

如果要使用命令行下载,那么可以输入you-get 网址即可下载嗅探到的视频图片音乐了。

而如果要编写程序(比如要进行批量操作),那么可以按如下方式编写,-o指定保存位置,目录不存在会自动创建:

path = "bilibili"  # 要保存的位置,不存在会自动创建
sys.argv = ["you-get", "-o", path, url3]
you_get.main()

you-get 中文说明地址

目前支持解析的网站与能解析的媒体类型信息如下:

网站 URL 视频 图像 音频
YouTube https://www.youtube.com/    
Twitter https://twitter.com/  
VK http://vk.com/    
Vine https://vine.co/    
Vimeo https://vimeo.com/    
Vidto http://vidto.me/    
Veoh http://www.veoh.com/    
Tumblr https://www.tumblr.com/
TED http://www.ted.com/    
SoundCloud https://soundcloud.com/    
Pinterest https://www.pinterest.com/    
MusicPlayOn http://en.musicplayon.com/    
MTV81 http://www.mtv81.com/    
Mixcloud https://www.mixcloud.com/    
Metacafe http://www.metacafe.com/    
Magisto http://www.magisto.com/    
Khan Academy https://www.khanacademy.org/    
JPopsuki TV http://www.jpopsuki.tv/    
Internet Archive https://archive.org/    
Instagram https://instagram.com/  
Heavy Music Archive http://www.heavy-music.ru/    
Google+ https://plus.google.com/  
Freesound http://www.freesound.org/    
Flickr https://www.flickr.com/  
Facebook https://www.facebook.com/    
eHow http://www.ehow.com/    
Dailymotion http://www.dailymotion.com/    
CBS http://www.cbs.com/    
Bandcamp http://bandcamp.com/    
AliveThai http://alive.in.th/    
interest.me http://ch.interest.me/tvn    
755ナナゴーゴー http://7gogo.jp/  
niconicoニコニコ動画 http://www.nicovideo.jp/    
163网易视频网易云音乐 http://v.163.com/http://music.163.com/  
56网 http://www.56.com/    
AcFun http://www.acfun.tv/    
Baidu百度贴吧 http://tieba.baidu.com/  
爆米花网 http://www.baomihua.com/    
bilibili哔哩哔哩 http://www.bilibili.com/    
Dilidili http://www.dilidili.com/    
豆瓣 http://www.douban.com/    
斗鱼 http://www.douyutv.com/    
凤凰视频 http://v.ifeng.com/    
风行网 http://www.fun.tv/    
iQIYI爱奇艺 http://www.iqiyi.com/    
激动网 http://www.joy.cn/    
酷6网 http://www.ku6.com/    
酷狗音乐 http://www.kugou.com/    
酷我音乐 http://www.kuwo.cn/    
乐视网 http://www.letv.com/    
荔枝FM http://www.lizhi.fm/    
秒拍 http://www.miaopai.com/    
MioMio弹幕网 http://www.miomio.tv/    
痞客邦 https://www.pixnet.net/    
PPTV聚力 http://www.pptv.com/    
齐鲁网 http://v.iqilu.com/    
QQ腾讯视频 http://v.qq.com/    
阡陌视频 http://qianmo.com/    
Sina新浪视频微博秒拍视频 http://video.sina.com.cn/http://video.weibo.com/    
Sohu搜狐视频 http://tv.sohu.com/    
天天动听 http://www.dongting.com/    
Tudou土豆 http://www.tudou.com/    
虾米 http://www.xiami.com/    
阳光卫视 http://www.isuntv.com/    
音悦Tai http://www.yinyuetai.com/    
Youku优酷 http://www.youku.com/    
战旗TV http://www.zhanqi.tv/lives    
央视网 http://www.cntv.cn/    

🚕autoscraper

这是一个学起来超快、基本上无需动脑的、被称为“最聪明”的爬虫,从名字上就不难发现:auto+scraper,自动 + 爬虫,让你无需繁琐的找xpath、找css选择器,他能从你要抓取的网页中,搜索到你想要的数据,并建立爬取规则(就是经过什么样的路径能找到想要的数据)。

使用pip install autoscraper即可安装此库,像如图一样显示Successfully就说明安装成功了。

请添加图片描述

一般情况下是不需要更改规则的,比如爬C站首页的热点(你们使用一定要将当天的文字粘贴到wanted_list里面),据我测试,好像在交互式窗口执行获取到的结果为空,所以建议写进文件执行:

scraper = AutoScraper()
result = scraper.build(url=url4, wanted_list=['“我辞掉了年薪45万美元的开发工作”'])
print(result)
返回:['“我辞掉了年薪45万美元的开发工作”', '从面临退学到华为「天才少年」', '需求着急上线,是写烂代码的理由吗?', '被微软收购后却惨遭下架', '现实世界的密文', '历史上的今天:Skype 取代 MSN', 'iOS 15.4发布,支持戴口罩解锁', '开源中的巾帼力量', '苹果维修堪比登天难:评级F,获最低分!', '第一位女性商业程序员玛丽库姆斯去世']

(如图,这是今天的热点:)

请添加图片描述

🛺urllib

这个库是标准库,不用下载安装,是所有爬虫库的最最最底层库,我想现在用的人应该挺少的吧,在没网下载其他第三方库的时候就可以用这个库。【PS:没网你爬什么?】

核心访问网址方法,会返回一个HTTPResponse对象:

res = request.urlopen(url2 + '?test=004')
res返回:<http.client.HTTPResponse object at 0x00000186880FE550>

我们可以从这个HTTPResponse对象中获取返回网页的地址、状态码、请求头和网站内容,其中网站内容只能获取一次,第二次以及之后只能得到一片空白:

# 返回的网页的地址
>>> res.geturl()
'http://110.42.181.215:8866'
# 返回的网页的状态码
>>> res.getcode()
200
# 获取请求头,以[()]列表内嵌套元组的形式返回
>>> res.getheaders()
[('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '2647'), ('Server', 'Werkzeug/1.0.1 Python/3.7.9'), ('Date', 'Tue, 15 Mar 2022 16:32:26 GMT')]
# 获取网站内容【该方法只能获得一次数据,然后res.fp数据体就变成None,第二次使用使用不会获得数据】
>>> res.read().decode()
'<!DOCTYPE html>\n<html>\n\t<head>\n\t\t<meta charset="utf-8">\n\t\t<title>炸飞机双人小游戏在线玩</title>\n\t\t<link rel="stylesheet" href="static/sky.css" />\n\t\t<script src="static/play.js"></script>\n\t</head>\n\t<body οnlοad="">\n\t\t<center class="outer">\n\t\t\t<div class="title">\n\t\t\t\t<h2>炸飞机双人小游戏在线玩</h2>\n\t\t\t</div>\n\t\t\t<div class="sky left">\n\t\t\t\t<center>我方飞机区域</center>\n\t\t\t\t<div id="left" οndrοp="drop(event)" οndragοver="allowDrop(event)"></div>\n\t\t\t</div>\n\t\t\t<div class="sky right">\n\t\t\t\t<center>敌方飞机区域</center>\n\t\t\t\t<div id="right"></div>\n\t\t\t</div>\n\t\t</center>\n\t\t<div id="plans" style="">\n\t\t\t<div id="plan1" draggable="true" οndragstart="drag(event)" οndblclick="set_direction(\'plan1\')"></div>\n\t\t\t<div id="plan2" draggable="true" οndragstart="drag(event)" οndblclick="set_direction(\'plan2\')"></div>\n\t\t\t<div id="plan3" draggable="true" οndragstart="drag(event)" οndblclick="set_direction(\'plan3\')"></div>\n\t\t</div>\n\t\t<div class="tip">\n\t\t\t<h3>游戏说明:</h3>\n\t\t\t<p>1、 点击创建房间获取房间号,邀请另一半输入房间号即可加入房间。</p>\n\t\t\t<p>2、如果电脑屏幕分辨率较低,可以按住 Ctrl 和鼠标滚轮调整缩放,推荐使用<b><span style="color: red;">1920x1080</span></b>分辨率。</p>\n\t\t\t<p>3、如果击中敌方飞机则方块 变红,否则方块变白;击中飞机核心(红色虚线)则整个飞机都会显示且变灰(代表已被击毁),比谁能更快击毁对方三架飞机吧~</p>\n\t\t\t<p>4、每个人都要放置3架飞机,一旦放下不可更改,拖动到我方飞机区域(左)内即可,双击可以顺时针调整方向,拖动时请将飞机核心(红色虚线)对准拖动后的方块。</p>\n\t\t\t<p>5、本游戏为回合制游戏,先摆放完者将先手,点击敌方飞机区域(右)进行攻击,击中飞机中心(红虚线边框方块)则飞机立刻坠毁,坠毁后会在图中显示飞机轮廓,不可撤销攻击,请谨慎攻击。</p>\n\t\t</div>\n\t\t<div id="start", style="">\n\t\t\t<aside class="control">\n\t\t\t\t<p>请输入房间号开始游戏<p>\n\t\t\t\t<p>\n\t\t\t\t<form id="play" method="get" action="/">\n\t\t\t\t\t<p id="room"><input type="text" name="room" placeholder="请输入 房间号(4位数字)" /></p>\n\t\t\t\t\t<p id="res">\n\t\t\t\t\t\t<span>大小:</span>\n\t\t\t\t\t\t<select name="size">\n\t\t\t\t\t\t\t<option value="10">10</option>\n\t\t\t\t\t\t\t<option value="12">12</option>\n\t\t\t\t\t\t\t<option value="15">15</option>\n\t\t\t\t\t\t\t<option value="20">20</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t\t<input type="submit" value="加入" />\n\t\t\t\t\t</p>\n\t\t\t\t</form>\n</p>\n\t\t\t\t<p><a></a></p>\n\t\t\t</aside>\n\t\t</div>\n\t\t<style></style>\n\t</body>\n</html>'

request.urlopen默认是GET方法,当有data参数时,请求方法自动变成POST,测试如下:

# GET方法
>>> res = request.urlopen(url2 + '?test=004')
>>> res.read().decode('unicode-escape')
'{"content":{"test":"004"},"method":"GET","res":"提交成功","title":"表单自动响应"}\n'
# POST方法
>>> res = request.urlopen(url2, data=b'test=005')
>>> res.read().decode('unicode-escape')
'{"content":{"test":"005"},"method":"POST","res":"提交成功","title":"表单自动响应"}\n'

当然,在使用了Request请求头对象之后,不仅能传递headers请求头,而且即时传入data也能用GET请求:

>>> req = request.Request(url2, data=b'test=006', headers=headers, method='GET')
>>> res = request.urlopen(req, data=b'test=007')
>>> res.read().decode('unicode-escape')
'{"content":{"test":"007"},"method":"GET","res":"提交成功","title":"表单自动响应"}\n'

上面是urllib.request的主要用法,接下来还有一些urllib.parse中常用的解析函数:

# 处理中文,对汉字进行编码操作
>>> parse.quote('test=测试')
'test%3D%E6%B5%8B%E8%AF%95'
# 处理中文,对汉字进行解码操作
>>> parse.unquote('test%3D%E6%B5%8B%E8%AF%95')
'test=测试'
# 用字典进行拼接字符串并编码(适用于较长的url参数)
>>> parse.urlencode({'test': '测试'})
'test=%E6%B5%8B%E8%AF%95'
# 拆分网址各部分
>>> parse.urlparse(url2 + '?test=测试')
ParseResult(scheme='http', netloc='110.42.181.215:9966', path='/login', params='', query='test=测试', fragment='')
# 合并网址各部分
>>> parse.urlunparse(['http', '110.42.181.215:6699', 'login', '', 'test=测试', ''])
'http://110.42.181.215:6699/login?test=测试'

总结

  • requests——最普遍使用的爬虫库
  • you-get——最受欢迎的爬虫库
  • autoscraper——最智能的爬虫库
  • urllib——最底层的爬虫库
  • 发出爬虫不容易,希望喜欢的小伙伴可以在关注博主的同时点个小小的赞和收藏,你的支持是我最大的动力!

你会经常使用哪一个爬虫库呢?来投个票吧~

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门