模拟按住鼠标拖动的效果,或者是在某个标签上的某个位置点击的效果,主要用来做验证码的破解(滑动验证码)
from selenium import webdriver from selenium.webdriver import ActionChains import time from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') driver.implicitly_wait(10) # 使用隐式等待 driver.maximize_window() try: driver.switch_to.frame('iframeResult') ##切换到iframeResult sourse=driver.find_element(By.ID,'draggable') target=driver.find_element(By.ID,'droppable') #方式一:基于同一个动作链串行执行 # actions=ActionChains(driver) #拿到动作链对象 # actions.drag_and_drop(sourse,target) #把动作放到动作链中,准备串行执行 actions=ActionChains(driver).click_and_hold(sourse) actions.drag_and_drop_by_offset(target,10,20) actions.perform() #方式二:不同的动作链,每次移动的位移都不同 # ActionChains(driver).click_and_hold(sourse).perform() # distance = target.location['x'] - sourse.location['x'] # 两个控件的x轴的距离 # track=0 # while track < distance: # ActionChains(driver).move_by_offset(xoffset=2,yoffset=0).perform() # track+=2 # # ActionChains(driver).move_by_offset(xoffset=distance, yoffset=0).perform() # ActionChains(driver).release().perform() time.sleep(10) finally: driver.close() ''' 总结: -ActionChains(driver).move_by_offset(xoffset=2,yoffset=0).perform() 滑块,滑动验证码的破解 -actions.drag_and_drop_by_offset(target,10,20) 原来的12306的点选,cnblgs选出所有红绿灯的验证码 actions=ActionChains(driver) actions.drag_and_drop_by_offset(target,10,20) ''' # 12306 自动登录---》滑块显示不出来---》检测到咱们使用自动化测试软件控制了
XPath 是一门在 XML 文档中查找信息的语言
一般解析库都会有子的的搜索标签的方法,一般都会支持css和xpath
使用
div:找div标签 /:找当前路径下的标签 //:找当前路径下子子孙孙下的标签 .:表示当前路径 ..:表示上一层路径 @:表示取属性
案例
doc=''' <html> <head> <base href='http://example.com/' /> <title>Example website</title> </head> <body> <div id='images'> <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a> <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a> <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a> <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a> <a href='image5.html' class='li li-item' name='items'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a> <a href='image6.html' name='items'><span><h5>test</h5></span>Name: My image 6 <br /><img src='image6_thumb.jpg' /></a> </div> </body> </html> ''' from lxml import etree html=etree.HTML(doc) # html=etree.parse('search.html',etree.HTMLParser()) # 1 所有节点 # a=html.xpath('//*') # 2 指定节点(结果为列表) # a=html.xpath('//head') # 3 子节点,子孙节点 # a=html.xpath('//div/a') # a=html.xpath('//body/a') #无数据 # a=html.xpath('//body//a') # 4 父节点 # a=html.xpath('//body//a[@href="image1.html"]/..') # a=html.xpath('//body//a[1]/..') # 也可以这样 # a=html.xpath('//body//a[1]/parent::*') # 5 属性匹配 # a=html.xpath('//body//a[@href="image1.html"]') # 6 文本获取 # a=html.xpath('//body//a[@href="image1.html"]/text()') # 7 属性获取 # a=html.xpath('//body//a/@href') # # 注意从1 开始取(不是从0) # a=html.xpath('//body//a[1]/@href') # 8 属性多值匹配 # a 标签有多个class类,直接匹配就不可以了,需要用contains # a=html.xpath('//body//a[@class="li"]') # a=html.xpath('//body//a[contains(@class,"li")]') # a=html.xpath('//body//a[contains(@class,"li")]/text()') # 9 多属性匹配 # a=html.xpath('//body//a[contains(@class,"li") or @name="items"]') # a=html.xpath('//body//a[contains(@class,"li") and @name="items"]/text()') # # a=html.xpath('//body//a[contains(@class,"li")]/text()') # 10 按序选择 # a=html.xpath('//a[2]/text()') # a=html.xpath('//a[2]/@href') # 取最后一个 # a=html.xpath('//a[last()]/@href') # 位置小于3的 # a=html.xpath('//a[position()<3]/@href') # 倒数第二个 # a=html.xpath('//a[last()-2]/@href') # 11 节点轴选择 # ancestor:祖先节点 # 使用了* 获取所有祖先节点 # a=html.xpath('//a/ancestor::*') # # 获取祖先节点中的div # a=html.xpath('//a/ancestor::div') # attribute:属性值 # a=html.xpath('//a[1]/attribute::*') # child:直接子节点 # a=html.xpath('//a[1]/child::*') # descendant:所有子孙节点 # a=html.xpath('//a[6]/descendant::*') # following:当前节点之后所有节点 # a=html.xpath('//a[1]/following::*') # a=html.xpath('//a[1]/following::*[1]/@href') # following-sibling:当前节点之后同级节点 # a=html.xpath('//a[1]/following-sibling::*') # a=html.xpath('//a[1]/following-sibling::a') # a=html.xpath('//a[1]/following-sibling::*[2]') # a=html.xpath('//a[1]/following-sibling::*[2]/@href') # print(a)
-简单的数字字母组合可以使用图像识别(python 现成模块),成功率不高
-使用第三方打码平台(破解验证码平台),花钱,把验证码图片给它,它给你识别完,返回给你
from selenium import webdriver from selenium.webdriver.common.by import By from PIL import Image bro = webdriver.Chrome() bro.get('http://www.chaojiying.com/user/login/') bro.maximize_window() try: bro.save_screenshot('main.png') # 把当前页面截图截图 img = bro.find_element(By.XPATH, '/html/body/div[3]/div/div[3]/div[1]/form/div/img') location = img.location size = img.size print(location) print(size) # 使用pillow扣除大图中的验证码 img_tu = ( int(location['x']), int(location['y']), int(location['x'] + size['width']), int(location['y'] + size['height'])) # # 抠出验证码 # #打开 img = Image.open('./main.png') # 抠图 fram = img.crop(img_tu) # 截出来的小图 fram.save('code.png') from chaojiying import ChaojiyingClient chaojiying = ChaojiyingClient('306334678', 'lqz12345', '937234') im = open('a.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要// print(chaojiying.PostPic(im, 1902)) except: pass finally: bro.close()
Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速、简单、可扩展的方式从网站中提取所需的数据。但目前Scrapy的用途十分广泛,可用于如数据挖掘、监测和自动化测试等领域,也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫
专业爬虫:爬虫框架(scrapy),在固定位置写固定代码,就能完成爬虫的功能。
安装:
mac,linux:
pip3 install scrapy
win(上面的命令可能装不上):
1、pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:https://www.lfd.uci.edu/~gohlke/pythonlibs 2、pip3 install lxml 3、pip3 install pyopenssl 4、下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/ 6、下载twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 7、执行pip3 install 下载目录\Twisted-17.9.0-cp36-cp36m-win_amd64.whl 8、pip3 install scrapy
框架---》架构
1 spiders:爬虫(咱们的代码)
2 engin :引擎(大总管)
3 scheduler:调度器(排队,谁先爬谁后爬,去重)
4 downloader:下载器(真正的负责发送http请求,获取数据,性能很高,基于twisted,性能很高的网络框架)
5 piplines:管道(保存数据)
# 引擎(EGINE) 引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。 # 调度器(SCHEDULER) 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址 # 下载器(DOWLOADER) 用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的 # 爬虫(SPIDERS) SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求 # 项目管道(ITEM PIPLINES) 在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作 # 下载器中间件(Downloader Middlewares) 位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response, # 爬虫中间件(Spider Middlewares) 位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)
scrapy是爬虫界的django
scrapy startproject myfirstscrapy
scrapy genspider cnblogs cnblogs.com
firstscrapy # 项目名 firstscrapy # 文件夹 spiders # 文件夹,一个个的爬虫 cnblogs.py # 其中一个爬虫,重点写代码的地方(解析数据,发起请求)***** items.py # 类比djagno的models,表模型--》类 *** middlewares.py # 中间件:爬虫中间件和下载中间件都在里面 *** pipelines.py # 管道,做持久化需要在这写代码 *** settings.py # 配置文件 ** scrapy.cfg # 上线配置,开发阶段不用
scrapy crawl 爬虫名字 --nolog
或者在项目路径下新建main.py--->右键运行
from scrapy.cmdline import execute execute(['scrapy','crawl','cnblogs','--nolog'])