【Python爬虫】你还在纠结选择哪个爬虫库嘛,全都拿来吧你
requests——最普遍使用的爬虫库you_get——最受欢迎的爬虫库autoscraper——最智能的爬虫库urllib——最底层的爬虫库
🌈据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。
前言:
🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
👍专栏介绍:Python爬虫 ,一个专注于分享爬虫技巧与案例的专栏~
专栏文章直链:
对旧博客反爬指导文章部分更新说明
beautifulsoup4无法正确解析网页的坑
QQ相关信息获取
Python爬取曾今的K歌
用“小聪明”实现连续爬取谷歌翻译
手把手带你用Python爬取反爬策略的网站
你学过爬虫吗,你用过这些爬虫库吗,这些都是非(大型框架、驱动浏览器和分布式)的爬虫库。
😆获取数据部分
🚗requests
看到目录,爬虫初学者可能只认识这个库,因为他是使用最多的爬虫库,也是最常见的爬虫库。
requests是用Python编写的、基于urllib3、采用Apache2 Licensed开源协议的HTTP库。它比urllib更方便,可以节约我们大量的工作,完全满足日常HTTP测试需求。
使用pip install requests
即可安装此库,像如图一样显示 Successfully 就说明安装成功了。
先将本章需要的第三方库、网址、请求头等准备好:
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()
目前支持解析的网站与能解析的媒体类型信息如下:
网站 | URL | 视频 | 图像 | 音频 |
---|---|---|---|---|
YouTube | https://www.youtube.com/ | ✓ | ||
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/ | ✓ | ||
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/ | ✓ | ||
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/ | ✓ | ✓ | |
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——最底层的爬虫库
- 发出爬虫不容易,希望喜欢的小伙伴可以在关注博主的同时点个小小的赞和收藏,你的支持是我最大的动力!
你会经常使用哪一个爬虫库呢?来投个票吧~
更多推荐
所有评论(0)