爬虫指南
大家好!这里是大家的三岁1024来临之际祝各位头发兴旺,思如泉涌,bug消散……
爬虫说明
什么是爬虫? 爬行的毛毛虫? 爬行的虫子? 记得有个女孩子曾和我说过,你不要说爬虫了,一听见我就全身起鸡皮疙瘩;
这……
爬虫嘛“网络扒手”,在互联网上的蜘蛛,利用http协议进行工作,名字很奇怪但是用的真香啊~~~
分类
- 脚本爬虫:就是我们用的小脚本,通过几个比较好的第三方库对页面信息进行爬取,获得自己要的数据
- 中等爬虫:脚本已经满足不了需求了,在部分公司大厂中有需求但是需求不是很高的时候,可以对特定的第三方库自定义开发后使用
- 大型爬虫(爬虫框架):这个大家都用过比如常见的百度,谷歌等搜索引擎包括淘宝、京东等购物平台的数据查找都属于爬虫,这些都是大量的同行们拿自己的发量堆积出来的,致敬!
接下来对小爬虫的几种形式进行说明
html中就有数据
在网页 中就有我们要的数据那么真的太太太幸福了!
只需要request一下那么就ok了
话不多说上例子
爬取百度页面的“百度一下”按钮中的文字
先前期准备:
查看是否有requesta、bs4等第三方库
没有的话打开cmd
pip install requests
pip install bs4
pip install lxml
-i http://mirrors.aliyun.com/pypi/simple/ # 镜像地址
# 如果按转失败可以加上镜像地址或查看是不是pip未更新
接下去就是打开百度页面进行“踩点”(F12万能的开发者工具)
让我们找一找百度一下吧!
点击小箭头然后选择我们要找的地方,见证奇迹的时刻……
此时我们就可以开始我们的互联网之旅了【狗头】
先获取我们的百度页面
import requests
r = requests.get('https://www.baidu.com/')
print(r)
print(r.text)
# 结果输出
<Response [200]>
<!DOCTYPE html>
<!--STATUS OK-->………… # 此处进行了省略
</p> </div> </div> </div> </body> </html>
我们已经获取到了html
开始找我们的“百度一下”
先对网页进行解析
from bs4 import BeautifulSoup
html = BeautifulSoup(r.text, 'lxml') # 这里的lxml没有下载有可能报错
这样子得到的页面就是html格式的页面了
乱码处理
但是得到的本该是中文的地方却是乱码,无法读取,应该是少了什么!
查看源码发现是‘utf-8’的编码形式,那么就好办了
import requests
from bs4 import BeautifulSoup
r = requests.get('https://www.baidu.com/')
r.encoding = "utf-8"
html = BeautifulSoup(r.text, 'lxml') # 这里的lxml没有下载有可能报错
部分截图内容,这样子问题基本上解决。
那么久剩下来获取资料了
1、使用bs4
2、使用re
两个各自有自己的优缺让我们视情况 而定吧!
bs4获取“百度一下”
先上代码:
import requests
from bs4 import BeautifulSoup
url = 'https://www.baidu.com/'
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'}
r = requests.get(url, headers=headers)
r.encoding = "utf-8"
# print(r.text)
html = BeautifulSoup(r.text, 'lxml').body
span = html.find_all('input', id='su')[0].attrs['value']
print(span)
input
百度一下
解析:
先在页面用F12进行定位获得有关的标签信息
利用方法选择器 find_all
进行选择
html.find_all('input', id='su')
就获得了
[<input class=“bg s_btn” id=“su” type=“submit” value=“百度一下”/>]
接着我们采用节点选择器获取里面的信息
通过attrs获得所有的属性值并返回一个字典
如果有不清楚的可以点击参考文档
获得结果{'type': 'submit', 'id': 'su', 'value': '百度一下', 'class': ['bg', 's_btn']}
这个时候只需要通过‘key’“value”就可以获得结果
用re(正则表达式)获取
此处用正则表达式意义不大就不演示了把两个方案进行展示
pattern_2 = re.compile('<li>: (.+)</li></ul></div>')
p2 = re.findall(pattern_2, str(div))[0]
通过“<li>: (.+)</li></ul></div>”获取中间(.+)位置的内容
pattern_2 = '<li>: .*</li></ul></div>'
p2 = re.findall(pattern_2, str(div))[0]
获取以<li>开通以</ul></div>结尾的所有内容
具体情况就看大家自己的实际操作了。
正则表达式不会很头疼,学的也很头疼,但是用起来却很爽,欲罢不能~~~
html中没有数据,数据在json中
这个时候就需要查看我们network又是一个让我们欲罢不能的好功能
点击F12选择network即可
打开network发现花花白白的怎么办???
这个时候刷新页面,见证奇迹的时刻到了
数据都出来了,这就是传说中的抓包吧直呼过瘾
这个是就是找我们需要的数据的时候了
找到数据进行预览查看数据
确认查找正确以后我们再查看获得方式和url即可
import requests
import json
url = ''
headers = {'user-agent': ''}
r = requests.get(url, heardes=headers)
r_json = json.loads(r.text)
print(r_json)
获取的json和字典一样直接通过“key”值即可获得和查看
通过key的获取来获得你想要的数据及资源。
网页‘加密的’需要渲染才有数据的
有些网页写的很好你找不到想要的数据但是网页上也有那么就很脑壳痛了
有个小工具可以解决这一困扰
安装selenium
windows下在cmd命令行下使用pip3 install selenium安装,出现successful即为成功
安装chromedriver
进入http://chromedriver.chromium.org/downloads或者http://npm.taobao.org/mirrors/chromedriver/下载
以谷歌官方为例,首先查看浏览器版本信息!
谷歌点击左上角…
然后选择设置
查看版本号
在网站中找到对应的版本即可,下载后放到谷歌浏览器所在的目录下。
检查
打开python编辑器
python
from selenium import webdriver
drivier=webdriver.Chrome()
查看是否运行谷歌浏览器
运行即可
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
path = ''
chrome_path = 'C:/Program Files (x86)/Google/Chrome/Application/chromedriver.exe'
os.environ['webdriver.chrome.driver'] = chrome_path # 设置系统环境变量
chrome_options = Options()
chrome_options.add_argument('--headless')
drive = webdriver.Chrome(chrome_path, chrome_options=chrome_options) # 打开谷歌浏览器
drive.get(path) # 打开一个网址
# print(drive.page_source)
html = BeautifulSoup(drive.page_source, 'lxml')
drive.quit() # 退出浏览器
print(html)
这样子只要输入网址就可以获得渲染以后的网页代码而且不会出现被控制的浏览器效果好极了!
以上三种爬虫可以解决我们生活中大部分的内容很嗨皮的
今天的三岁就介绍到这里下次我们再继续记得一键三连哦!