js抓取网页内容(抓的妹子图都是直接抓Html就可以的 )
优采云 发布时间: 2021-09-20 09:06js抓取网页内容(抓的妹子图都是直接抓Html就可以的
)
导言
以前的姐妹图片是直接用HTML(即chrome浏览器F12)捕获的
elements页面结构返回与网络数据包捕获相同的结果。从后面拿一些
网站(如煎蛋和那些小的网站)发现了它并抓住了那里的袋子
没有获得任何数据,但在元素中存在一些情况。原因是页面的数据是
通过javascript动态生成:
一开始,我想自己学习一批JS基本语法,然后模拟数据包捕获
获取其他人的JS文件,自己分析逻辑,然后计算出真正的URL。后来是
放弃。毕竟,有太多的页面需要掌握。什么时候会像这样分析每一个
后来,我偶然发现了一个自动化测试框架:selenium可以帮助我们解决这个问题
简单地说,这东西有什么用?我们可以编写代码来制作浏览器:
那么这个东西不支持浏览器功能。您需要在第三方浏览器中使用它
要支持以下浏览器,您需要将相应的浏览器驱动程序下载到Python的相应路径:
铬:
火狐:
幻影:
即:
边缘:
歌剧:
让我们从这一节开始~
1.安装硒
这很简单。您可以通过PIP命令行直接安装:
sudo pip install selenium
PS:我记得我的公司合伙人问我为什么不能在win上实现PIP,有很多PIP
事实上,如果安装Python3,默认情况下它已经有了PIP。您需要配置另一个环境
变数。PIP的路径位于python安装目录的scripts目录中~
只需在路径之后添加此路径~
2.下载浏览器驱动程序
因为selenium没有浏览器,所以它需要依赖第三方浏览器并调用第三方浏览器
对于浏览器,您需要下载浏览器驱动程序,因为作者使用chrome
以Chrome为例,其他浏览器自己搜索相关信息!打开Chrome浏览器并键入:
chrome://version
您可以查看有关Chrome浏览器版本的相关信息。在这里,只需关注版本号:
61。好的,接下来,转到以下网站检查相应的驱动程序版本号:
好的,那就下载吧v2.Version 34浏览器驱动程序:
下载后,解压缩zip文件并将解压缩后的chromedriver.exe复制到python
在脚本目录中。(不需要与Win32纠缠,它可以在64位浏览器上正常使用!)
PS:对于Mac,将提取的文件复制到usr/local/bin目录
对于Ubuntu,将其复制到usr/bin目录
接下来,让我们编写一个简单的代码进行测试:
from selenium import webdriver
browser = webdriver.Chrome() # 调用本地的Chrome浏览器
browser.get('http://www.baidu.com') # 请求页面,会打开一个浏览器窗口
html_text = browser.page_source # 获得页面代码
browser.quit() # 关闭浏览器
print(html_text)
执行此代码将自动调用浏览器并访问百度:
控制台将输出HTML代码,即直接获得的元素页面结构
在JS被执行后,我们可以抓到我们的煎蛋女照片
3.Selenium简单实战:抓取煎蛋女图片
直接分析元素页面结构以找到所需的关键节点:
显然,这是我们小妹妹的照片。复制URL并查看我们打印的内容
页面结构中是否存在这样的内容:
是的,很好。有了这个页面数据,我们将经历一波美丽的汤来获得我们
你想要的数据~
经过以上过滤,我们可以得到我们的姐妹图片URL:
打开验证,单击:
看完下一页,只有30个*敏*感*词*妹,显然不能和我们见面。我们第一次装了
首先获取大量的页码,然后知道有多少页,然后拼接URL并自己加载
不同的页面,例如,总共有448页:
拼接到这样一个URL中:
通过过滤获得的页码:
接下来,填写代码,循环抓取每个页面上的小妹妹,然后在本地下载
完整代码如下:
import os
from selenium import webdriver
from bs4 import BeautifulSoup
import urllib.request
import ssl
import urllib.error
base_url = 'http://jandan.net/ooxx'
pic_save_path = "output/Picture/JianDan/"
# 下载图片
def download_pic(url):
correct_url = url
if url.startswith('//'):
correct_url = url[2:]
if not url.startswith('http'):
correct_url = 'http://' + correct_url
print(correct_url)
headers = {
'Host': 'wx2.sinaimg.cn',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/61.0.3163.100 Safari/537.36 '
}
try:
req = urllib.request.Request(correct_url, headers=headers)
resp = urllib.request.urlopen(req)
pic = resp.read()
pic_name = correct_url.split("/")[-1]
with open(pic_save_path + pic_name, "wb+") as f:
f.write(pic)
except (OSError, urllib.error.HTTPError, urllib.error.URLError, Exception) as reason:
print(str(reason))
# 打开浏览器模拟请求
def browser_get():
browser = webdriver.Chrome()
browser.get('http://jandan.net/ooxx')
html_text = browser.page_source
page_count = get_page_count(html_text)
# 循环拼接URL访问
for page in range(page_count, 0, -1):
page_url = base_url + '/' + str(page)
print('解析:' + page_url)
browser.get(page_url)
html = browser.page_source
get_meizi_url(html)
browser.quit()
# 获取总页码
def get_page_count(html):
soup = BeautifulSoup(html, 'html.parser')
page_count = soup.find('span', attrs={'class': 'current-comment-page'})
return int(page_count.get_text()[1:-1]) - 1
# 获取每个页面的*敏*感*词*姐
def get_meizi_url(html):
soup = BeautifulSoup(html, 'html.parser')
ol = soup.find('ol', attrs={'class': 'commentlist'})
href = ol.findAll('a', attrs={'class': 'view_img_link'})
for a in href:
download_pic(a['href'])
if __name__ == '__main__':
ssl._create_default_https_context = ssl._create_unverified_context
if not os.path.exists(pic_save_path):
os.makedirs(pic_save_path)
browser_get()
经营成果:
看看我们的输出文件夹~
学习蟒蛇爬虫,天天减肥
4.PhantomJS
Phantom JS是一款没有界面的浏览器。功能:网站将加载到内存中并在页面上执行
JavaScript,因为它不显示图形界面,运行起来比一个完整的浏览器更高效
(在某些Linux主机上,没有图形界面就无法安装chrome等浏览器
您可以通过phantom JS避免此问题)
在Win上安装phantomjs:
在Ubuntu/Mac上安装phantomjs:
sudo apt-get install phantomjs
!!!关于phantomjs的重要注意事项:
今年4月,phantom.js的维护者宣布退出phantom js
这意味着该项目可能不再维护!!!Chrome和Firefox也已经启动
提供无头模式(无需挂断浏览器),因此估计小型合作伙伴使用phantom JS
它还将缓慢地迁移到这两种浏览器。Windows chrome需要60以上的版本才能支持
无头模式,启用无头模式也非常简单:
官方文件还指出:
在操作过程中也会报告此警告:
5.Selenium实战:模拟登录CSDN并保存cookie
CSDN登录网站:
在分析下面的页面结构后,不难找到相应的登录输入框和登录按钮:
我们需要做的是在这两个节点上输入帐户和密码,然后触发登录按钮
同时,在本地保存cookie,然后您可以使用cookie访问相关页面~
首先编写模拟登录的方法:
查找您输入帐户和密码的节点,设置您自己的帐户和密码,然后查找登录名
单击按钮节点,然后等待登录成功。登录成功后,您可以比较
当前\ URL是否已更改。然后把饼干保存在这里
我使用pickle图书馆。我可以使用其他方法,例如JSON或字符串拼接
然后在本地保存它。如果没有意外,你应该能够得到饼干,然后使用它们
访问主页的Cookie
通过添加Cookies方法设置Cookies。参数为字典类型。此外,你必须首先
访问get链接一次并设置cookie,否则将报告无法设置cookie的错误
检查右下角是否更改为登录状态,以了解使用Cookie登录是否成功:
6.Selenium共同功能
作为自动化测试的工具,selenium自然为自动化操作提供了许*敏*感*词*
下面是一些我认为常用的函数。有关更多信息,请参阅官方文件:
官方API文档:
1)定位元件
PS:将元素更改为元素将定位所有符合条件的元素并返回列表
例如:通过类名称查找元素
2)鼠标动作
有时需要在页面上模拟鼠标操作,如单击、双击、右键单击、按住、拖动等
您可以导入actionchains类:mon.action uChains.actionchains
使用actionchains(驱动程序)。XXX调用相应节点的行为
3)弹出窗口
对应类:mon.alert.alert。我认为不应该用太多
如果触发某个时间,弹出一个对话框,可以调用以下方法获取该对话框:
alert=driver.switch u到u alert(),然后可以调用以下方法:
4)页面前进、后退、切换
切换窗口:driver.Switch_uu至.window(“窗口名称”)
或通过窗口句柄进行遍历
对于driver.window中的句柄uhandles:
驾驶员侧开关至车窗(把手)
司机。前进()#前进
司机。后退()#后退
5)页面截图
driver.save屏幕截图(“Screenshot.PNG”)
6)页面等待
现在,越来越多的web页面采用Ajax技术,因此程序无法确定元素何时完成
装了。如果实际的页面等待时间太长,则DOM元素没有出现,但是
如果代码直接使用此webelement,将引发空指针异常
为了避免元素定位的困难,提高元素不可见异常的概率
因此,selenium提供了两种等待方法:隐式等待和显式等待
显式等待:
显式等待指定条件,然后设置最大等待时间。如果不是在这个时候
如果找到元素,将引发异常
from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverWait 库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions 类,负责条件出发
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.PhantomJS()
driver.get("http://www.xxxxx.com/loading")
try:
# 每隔10秒查找页面元素 id="myDynamicElement",直到出现则返回
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
如果不写入参数,程序将默认0.5s调用一次以查看元素是否已生成
如果元素已经存在,将立即返回该元素
以下是一些内置的等待条件。您可以直接调用这些条件,而无需自己
写一些等待条件
标题是
标题收录
元素的存在位置
所在元素的可见性
能见度
所有元素的存在
文本在元素中存在
文本在元素值中存在
框架可用,并且_