基于selenium实现自动化爬取数据

基于selenium实现自动化爬取数据

如果想具体查看selenium自动化模块的更多功能请看我的博客测试分类中有介绍

selenium

  • 概念:基于浏览器自动化的模块
  • 自动化:可以通过代码指定一系列的行为动作,然后将其作用到浏览器中。
  • pip install selenium
  • selenium和爬虫之间的关联
    • 1.便捷的捕获到任意形式动态加载的数据(可见即可得)
    • 2.实现模拟登录
  • 谷歌驱动下载:http://chromedriver.storage.googleapis.com/index.html
#1.基于浏览器的驱动程序实例化一个浏览器对象
bro = webdriver.Chrome(executable_path=‘./chromedriver‘)
#对目的网站发起请求
bro.get(‘https://www.jd.com/‘)
#标签定位
search_text = bro.find_element_by_xpath(‘//*[@id="key"]‘)
search_text.send_keys(‘iphoneX‘) #向标签中录入数据

btn = bro.find_element_by_xpath(‘//*[@id="search"]/div/div[2]/button‘)
btn.click()

sleep(2)

#在搜索结果页面进行滚轮向下滑动的操作(执行js操作:js注入)
bro.execute_script(‘window.scrollTo(0,document.body.scrollHeight)‘)
sleep(2)
bro.quit()
url = ‘http://125.35.6.84:81/xk/‘
bro = webdriver.Chrome(executable_path=‘./chromedriver‘)
bro.get(url)
page_text_list = []#每一页的页面源码数据
sleep(1)
#捕获到当前页面对应的页面源码数据
page_text = bro.page_source #当前页面全部加载完毕后对应的所有的数据
page_text_list.append(page_text)

#点击下一页
for i in range(2):
    next_page = bro.find_element_by_xpath(‘//*[@id="pageIto_next"]‘)
    next_page.click()
    sleep(1)
    page_text_list.append(bro.page_source)
for page_text in page_text_list:
    tree = etree.HTML(page_text)
    li_list = tree.xpath(‘//*[@id="gzlist"]/li‘)
    for li in li_list:
        name = li.xpath(‘./dl/@title‘)[0]
        print(name)
sleep(2)
bro.quit()

动作链

from selenium.webdriver import ActionChains
url = ‘https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable‘
bro = webdriver.Chrome(executable_path=‘./chromedriver‘)
bro.get(url)
sleep(1)
#如果通过find系列的函数进行标签定位,如果标签是存在于iframe下面,则会定位失败
#解决方案:使用switch_to即可
bro.switch_to.frame(‘iframeResult‘)
div_tag = bro.find_element_by_xpath(‘//*[@id="draggable"]‘)

#对div_tag进行滑动操作
action = ActionChains(bro)
action.click_and_hold(div_tag)#点击且长按

for i in range(6):
    #perform让动作链立即执行
    action.move_by_offset(10,15).perform()
    sleep(0.5)
bro.quit()

  • 如何让selenium规避检测

    • 有的网站会检测请求是否为selenium发起,如果是的话则让该次请求失败
    • 规避检测的方法:
      • selenium接管chrome浏览器
  • 实现步骤
    • 1.必须将你电脑中安装的谷歌浏览器的驱动程序所在的目录找到。且将目录添加到环境变量中。
    • 2.打开cmd,在命令行中输入命令:
      • chrome.exe --remote-debugging-port=9222 --user-data-dir="一个空文件夹的目录"
      • 指定执行结束后,会打开你本机安装好的谷歌浏览器。
    • 3.执行如下代码:可以使用下属代码接管步骤2打开的真实的浏览器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
#本机安装好谷歌的驱动程序路径
chrome_driver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"

driver = webdriver.Chrome(executable_path=chrome_driver,chrome_options=chrome_options)
print(driver.title)

12306模拟登录

url =https://kyfw.12306.cn/otn/login/init

主要用到ActionChains 链式操作,超级鹰解析验证码。还有图片得裁剪

import requests

import requests
from hashlib import md5

class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
        self.username = username
        password =  password.encode(‘utf8‘)
        self.password = md5(password).hexdigest()
        self.soft_id = soft_id
        self.base_params = {
            ‘user‘: self.username,
            ‘pass2‘: self.password,
            ‘softid‘: self.soft_id,
        }
        self.headers = {
            ‘Connection‘: ‘Keep-Alive‘,
            ‘User-Agent‘: ‘Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)‘,
        }

    def PostPic(self, im, codetype):
        """
        im: 图片字节
        codetype: 题目类型 参考 http://www.chaojiying.com/price.html
        """
        params = {
            ‘codetype‘: codetype,
        }
        params.update(self.base_params)
        files = {‘userfile‘: (‘ccc.jpg‘, im)}
        r = requests.post(‘http://upload.chaojiying.net/Upload/Processing.php‘, data=params, files=files, headers=self.headers)
        return r.json()

    def ReportError(self, im_id):
        """
        im_id:报错题目的图片ID
        """
        params = {
            ‘id‘: im_id,
        }
        params.update(self.base_params)
        r = requests.post(‘http://upload.chaojiying.net/Upload/ReportError.php‘, data=params, headers=self.headers)
        return r.json()

def tranformImgCode(imgPath,imgType):
    chaojiying = Chaojiying_Client(‘929235569‘, ‘lyz19960415‘, ‘904189‘)
    im = open(imgPath, ‘rb‘).read()
    return chaojiying.PostPic(im,imgType)[‘pic_str‘]

from selenium import webdriver
from selenium.webdriver import ActionChains
from time import sleep
from PIL import Image
headers = {

}
url = "https://kyfw.12306.cn/otn/login/init"
chrome = webdriver.Chrome(executable_path="./chromedriver")
#打开浏览器12306页面
chrome.get(url=url)
sleep(2)
#进行截图
chrome.save_screenshot("main.png")
#定位到image标签
img_tag = chrome.find_element_by_class_name("touclick-image")
#裁剪出截图中验证码部分
location = img_tag.location #验证码得左下角下标
size = img_tag.size  #验证码尺寸
#基于验证码尺寸指定裁剪范围
img_range = (int(location["x"]),int(location["y"]),int(location["x"]+size["width"]),int(location["y"]+size["height"]))
#根据img_range表示的裁剪范围进行图片的裁剪
i=Image.open("./main.png")
image =i.crop(img_range)
image.save("./code.png")
#用超级鹰获取坐标
result = tranformImgCode(‘./code.png‘,9004)

all_list = []
if "|" in result:  #这是存在2个图片都符合要求
    result1 = result.split("|") #[‘174,71‘, ‘272,60‘]
    count = len(result1)
    lst = []
    for w in range(count):
        x = int(result1[w].split(",")[0])
        y = int(result1[w].split(",")[1])
        lst.append(x)
        lst.append(y)
        all_list.append(lst)
else:  # 这是一个图片符合要求得
    lst = []
    x = int(result.split(",")[0])
    y = int(result.split(",")[1])
    lst.append(x)
    lst.append(y)
    all_list.append(lst)
for xy in all_list:
    x = xy[0]
    y = xy[1]
    ActionChains(chrome).move_to_element_with_offset(img_tag,x,y).click().perform()
sleep(1)
chrome.find_element_by_id("username").send_keys("洲神再次")
chrome.find_element_by_id("password").send_keys("1234567")
chrome.find_element_by_id("loginSub").click()

原文地址:https://www.cnblogs.com/zzsy/p/12687962.html

时间: 2024-11-07 01:08:02

基于selenium实现自动化爬取数据的相关文章

基于scrapy中---全站爬取数据----CrawlSpider的使用

#数据源:糗事百科 爬虫代码: 1 import scrapy 2 from scrapy.linkextractors import LinkExtractor 3 from scrapy.spiders import CrawlSpider, Rule 4 5 6 class QiubaiSpider(CrawlSpider): 7 name = 'qiubai' 8 # allowed_domains = ['www.xxx.com'] 9 start_urls = ['https://w

借助Chrome和插件爬取数据

工具 Chrome浏览器 TamperMonkey ReRes Chrome浏览器 chrome浏览器是目前最受欢迎的浏览器,没有之一,它兼容大部分的w3c标准和ecma标准,对于前端工程师在开发过程中提供了devtools和插件等工具,非常方便使用.在爬取数据的过程中,最常用的应该是开发工具中的Element.Source和Network功能,分别查看DOM结构,源码和网络请求.同时,有很多基于Chrome浏览器的插件又给我们赋予了浏览器级别的能力,来处理数据. TamperMonkey Ta

【个人】爬虫实践,利用xpath方式爬取数据之爬取虾米音乐排行榜

实验网站:虾米音乐排行榜 网站地址:http://www.xiami.com/chart 难度系数:★☆☆☆☆ 依赖库:request.lxml的etree (安装lxml:pip install lxml) IDEA开发工具:PyCharm_2017.3 Python版本:Python3 期望结果:爬取出排行版歌名以及对应歌手 运行效果图: 音乐排行榜: 爬取数据结果图: 像这种简单的爬取就没必要使用Scrapy框架进行处理,是在有点大材小用,不过如果你刚开始学Scrapy的话,拿这些简单的练

web scraper——简单的爬取数据【二】

web scraper——安装[一] 在上文中我们已经安装好了web scraper现在我们来进行简单的爬取,就来爬取百度的实时热点吧. http://top.baidu.com/buzz?b=1&fr=20811 文本太长,大部分是图片,所以上下操作视频吧,视频爬取的是昵称不是百度热点数据 链接:https://pan.baidu.com/s/1W-8kGDznZZjoQIk1e6ikfQ提取码:3dj7 爬取步骤 创建站点 打开百度热点,ctrl+shit+i进入检测工具,打开web scr

使用HttpClient+Json解析器爬取数据并存入数据库

一.题目要求 说明:这里我只展示爬取数据的代码,将可视化结果与统计数据结合,实时显示当前最新数据只需将这篇博客代码和我那篇使用Echarts可视化数据库数据结合即可 二.思路 同学思路:我的大部分同学思路是使用HttpClient+Jsoup获取并解析目标页面的数据,然后调用Dao层中的方法将数据筛选并存入数据库中 我的思路:我直接使用了一个网上的一个最新疫情数据Json的目标网页,然后使用HttpClient获取该Json格式数据,然后使用Json解析器将 数据分离,然后调用Dao层中的方法将

[Python爬虫] 之三:Selenium 调用IEDriverServer 抓取数据

接着上一遍,在用Selenium+phantomjs 抓取数据过程中发现,有时候抓取不到,所以又测试了用Selenium+浏览器驱动的方式:具体代码如下: #coding=utf-8import osimport refrom selenium import webdriverfrom selenium.webdriver.common.keys import Keysimport timefrom selenium.webdriver.common.action_chains import A

selenium+scrapy完成爬取特定的知乎界面,比如我爬取的就是搜索“”“某某某东西”

这个地方非常感谢此篇作者的帮助 :http://blog.csdn.net/uselym/article/details/52525025 一.建立一个scrapy框架的爬虫 二.在spider中首先构造登录 二.使用response构造需要获取到的数据 三.在parse函数中返回request请求. 四.在scrapy.Request()中指定url="你需要爬取的界面" 总结:对于知乎的动态界面,scrapy爬虫爬取始终没有selenium模拟上下滑动获取的比较完整,望注意. 原文

python爬取数据被限制?一招教你伪造反爬技术!

1.Headers限制 这应该是最常见的,最基本的反爬虫手段,主要是初步判断你是否是真实的浏览器在操作. 这个一般很好解决,把浏览器中的Headers信息复制上去就OK了. 值得注意的是,很多网站只需要userAgent信息就可以通过,但是有的网站还需要验证一些其他的信息,比如知乎,有一些页面还需要 authorization 的信息.所以需要加哪些Headers,还需要尝试,可能还需要Referer.Accept-encoding等信息. 2.IP限制 限制IP也是很多网站反爬虫的初衷,有些人

Python网络爬虫技巧小总结,静态、动态网页轻松爬取数据

很多人学用python,用得最多的还是各类爬虫脚本:有写过抓代理本机验证的脚本,有写过自动收邮件的脚本,还有写过简单的验证码识别的脚本,那么我们今天就来总结下python爬虫抓站的一些实用技巧. 静态网页 对于静态网页的爬虫不用多说大家也都知道,因为爬取静态网页非常的简单,只要用requests直接把html爬取下来然后用正则表达式匹配就可以了. 动态网页 相对于静态网页的简单,但是动态网页的就会相对而而言会复杂一下,而且现在互联网的发展速度,动态网页是最多的,静态网页是比较少的,不过他有张良计