js抓取网页内容(抓的妹子图都是直接抓Html就可以的 )

优采云 发布时间: 2021-09-20 09:06

  js抓取网页内容(抓的妹子图都是直接抓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调用一次以查看元素是否已生成

  如果元素已经存在,将立即返回该元素

  以下是一些内置的等待条件。您可以直接调用这些条件,而无需自己

  写一些等待条件

  标题是

  标题收录

  元素的存在位置

  所在元素的可见性

  能见度

  所有元素的存在

  文本在元素中存在

  文本在元素值中存在

  框架可用,并且_

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线