爬虫相信大家都不陌生,什么“爬虫爬的好,牢饭吃到饱”在网上流传甚广,但其实爬虫是一件很平常也很简单的事情。不知道是哪个大佬将这一个技术取名为爬虫,无形之间为它添加了一种恐怖的感觉,如果让我用最普通的话描述爬虫,完全可以称为字符串分割。
尽管元宇宙号称要打造一个沉浸式空间,但如果你用心观察,我们从互联网获得的数据总体可分为
- 字符串
- 图片
- 音频
- 视频
如果在细究下去又可以发现,我们在获取图片、音频、视频等较大的数据时其实获取的是它们的链接,也就是存放图片、音频、视频房子的名牌地址,所以我们从互联网获得的所有数据都可以用字符串来表示。
无论是一个多么复杂的网站,可能使用了很复杂的CSS渲染,也可能用了高级的JS动态,但最后我们的浏览器通过WWW地址获得的都是一串字符串,解析渲染得到最终的web页面。
所谓的爬虫,就是得到这一包含了所有页面数据的字符串,分割后提取我们想要的目标元素。
本文主要简单介绍python爬虫中经常会用到的若干库的用法
0. pip安装
python所有的库都可以使用pip快速安装,这是python相对于其他语言最大的优势。为了加快安装速度我们可以使用国内的镜像,这里使用豆瓣镜像,使用如下:
pip --default-timeout=100 install 库 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
只需要将库替换为你想要下载的pip库名字就可以
请在Terminal输入指令
1. requests库
简介:requests库是获取页面字符串数据的工具库,它模拟我们使用的浏览器接受网站服务器发送的数据,使用如下:
安装:
pip --default-timeout=100 install requests -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
案例:
import requests
headers={
'User-Agent':'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
}
url = "https://www.zhihu.com/hot"
r = requests.get(url,headers=headers)
print(r.text)
requests库是所有后续处理的前提,相当于采购员,买到所有我们需要的食材,headers表示我们的身份,用于绕过市场门卫。
之后的所有r都为提取后的字符串
2. BeautifulSoup库
简介:bs库将我们获得的字符串转换为XMl格式,再使用比如类选择器、id选择器等方法提取我们需要的数据
安装:
pip --default-timeout=100 install beautifulsoup4 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
pip --default-timeout=100 install lxml -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
案例:
from bs4 import BeautifulSoup
soup=BeautifulSoup(r.text,'lxml')
hotitem = soup.select('.css-3yucnr') #类选择器
for hi in hotitem:
print(hi.text)
bs库就是厨师,帮我们把食材洗干净切片,最后得到想要的萝卜心
3. re库
简介:re库是正则表达式所需要的库,是python自带的库
案例:
import re
s = r.text
res = re.findall('\d+',s)
print(res)
re库也是一个厨师,而且这个厨师啥都能切,可是切得准确度得看你的正则表达式熟练度
4. Xpath库
简介:使用Xpath方法提取我们需要的元素,可以直接在谷歌浏览器的F12界面复制Xpath路径,实现定位提取。
安装:
pip --default-timeout=100 install lxml -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
案例:
from lxml import etree
html = etree.HTML(r.text)
#目前的问题:在哪里使用XPath?怎么使用?——对html使用xpath
result = html.xpath('//td[@class="postbody"]/text()') #获得td节点下的文本
for i in result: #去杂
print(i)
5. selenium网页测试库
简介:selenium这个库就有点不讲武德了,他是建立在监视浏览器的层面上,通过打开一个浏览器得到浏览器得到的数据。如果说上面的库是从市场买食材,厨师处理,那么这个库就是从超市买处理好的食物,然后重新切割摆盘。
安装:
pip --default-timeout=100 install selenium -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
驱动文件下载地址:
http://chromedriver.storage.googleapis.com/index.html
请下载对应的谷歌浏览器版本,并将下载得到的.exe文件放在python文件同路径下
案例:
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
import time
#新建一个浏览器
option = ChromeOptions()
option.add_argument("--headless") # 隐藏游览器
# option.add_argument("--no--sandbox") #linux
s = Service("chromedriver.exe")
browser = Chrome(options=option, service=s)
url = "https://www.youkuaiyun.com/?spm=1001.2101.3001.4476"
browser.get(url)
# print(browser.page_source)
time.sleep(1)
# 爬虫与反爬,模拟人等待1秒
#Xpath路径提取
res = browser.find_elements(By.XPATH, '//*[@id="floor-nav_557"]/div/div/div/ul/li/a')
for r in res:
print(r.text)
#css选择器提取
ress = browser.find_elements(By.CSS_SELECTOR, '#floor-www-index_558 > div > div.www-home-content.active > div.headlines > div.headlines-right > div:nth-child(2) > div:nth-child(2) > div > div:nth-child(1) > a.title > strong')
print(ress[0].text)
灵活使用上述的工具库,对于大部分的网站都可以得到想要的数据,但对于有反爬虫机制的网站需要进一步的手段,而且要借招拆招。