金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > 编程 > 架构的血液,python爬虫入门

架构的血液,python爬虫入门

发布时间:2019-10-28 22:04编辑:编程浏览(68)

    没错,它们的确是一样的。因为委托是用函数来赋值的,所以调用方式一样也并不奇怪,不是吗。

     1 //建立TCP客户端TcpClient对象。
     2 TcpClient tcpclnt = new TcpClient();
     3 //连接服务器
     4 tcpclnt.Connect(IP地址字符串,端口号);
     5 //获得客户端网络传输 流
     6 Stream stm =tcpclnt.GetStream();
     7 //通过Stream的Write方法向服务器端发送的数据
     8 //通过Stream的Read方法读取服务器段发来的数据
     9 //在通讯结束后,需要释放资源,结束和服务器的连接
    10 tcpclnt.Close();
    

    2.定位元素的方法

    下面我们看下穿越应用的代码。

    (2)  使用远程主机的主机名和端口号创建TcpClient。

    firefox的目录也要添加到环境变量中

    如果委托是封装的函数,并且它又是引用类型。那么委托第一种常规的应用就浮现出来了。

    1. Client:获取或设置基础Socket
    2. ReceiveBufferSize:获取或设置接收缓冲区的大小
    3. SendBufferSize:获取或设置发送缓冲区的大小
    4. BeginConnect方法:开始一个对远程主机连接的异步请求
    5. Close:释放TcpClient 实例,不关闭基础连接
    6. Connect:使用指定的主机名和端口号将客户端连接到TCP主机
    7. GetStream:返回用于发送和接收数据的NetworkStream

    当页面出现了弹窗提示

    其实,只要定义好委托,并将委托正确的传递,就可以实现穿越的调用了。

     1 TcpClient tcpClientB = new TcpClient("www.baidu.com", 8888);//创建客户端 

    Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。

    委托的线程应用是委托的第二种用法,分为线程使用委托,和委托的异步应用两种。

    1. AcceptSocket/AcceptTcpClient:接受挂起的连接请求
    2. BeginAcceptSocket/BeginAcceptTcpClient:开始一个异步操作来接受一个传入的连接尝试
    3. Start:开始侦听传入的连接请求
    4. Stop:关闭侦听

    6.页面切换

    第一核心应用——随手线程:

    (2)使用远程主机的主机名和端口号创建TcpClient,此构造函数将自动尝试一个连接。

    全部取消方法

    因为委托是引用类型,所以可以被[址传递]。函数是不可以被传递的。

            主要提供制作Sockets网络应用程序的相关类,其中Socket类,TcpClient类、TcpListener类和UdpClient类较为常用。在.NET框架下开发时,直接使用System.Net.Sockets名称空间中的Socket类编程较为复杂,而应用层的类TcpClient、TcpListener 和 UdpClient为 Socket 通信提供了更简单、对用户更友好的接口。它们和Socket类之间的这种层次关系如图

     Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

    我们先从刚介绍过的委托的线程应用说起。

            这是它能够以更高的抽象程度提供TCP服务的基础。体现在网络数据的发送和接受方面,是TcpClient使用NetworkStream网络流处理技术,使得它读写数据更加方便直观。TcpClient类专为客户端设计,它为 TCP 网络服务提供客户端连接。

    3.鼠标动作

    后面我会继续写事件,消息,反射等语法,敬请期待。

    TcpListner:用于阻止同步模式下侦听和接受传入的连接请求。

    <input type="text" name="user-name" id="passwd-id" />
    

    Action与Func是微软为我们预先定义好了的,两个委托变量。其中Action是不带返回值的委托,Func是带返回值的委托。

    示例如下:通过以下方法得到NetworkStream网络流之后,就可以使用标准流读写方法Write和Read来发送和接受数据了。

    alert = driver.switch_to_alert()
    

    委托的基本应用

    (3)NetworkStream网络流:可以被视为一个数据通道,架设在数据来源端(客户Client)和接收端(服务Server)之间,通过TcpClient.GetStream方法,返回用于发送和接收数据的网络流NetworkStream。

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    from selenium import webdriver
    
    # 要想调用键盘按键操作需要引入keys包
    from selenium.webdriver.common.keys import Keys
    
    #创建浏览器对象
    driver = webdriver.Firefox()
    
    driver.get("http://www.baidu.com")
    
    #打印页面标题“百度一下你就知道”
    print driver.title
    
    #生成当前页面快照
    driver.save_screenshot("baidu.png")
    
    # id="kw"是百度搜索框,输入字符串“微博”,跳转到搜索中国页面
    driver.find_element_by_id("kw").send_keys(u"微博")
    
    # id="su"是百度搜索按钮,click() 是模拟点击
    driver.find_element_by_id("su").click()
    
    # 获取新的页面快照
    driver.save_screenshot(u"微博.png")
    
    # 打印网页渲染后的源代码
    print driver.page_source
    
    # 获取当前页面Cookie
    print driver.get_cookies()
    
    # ctrl+a 全选输入框内容
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
    
    # ctrl+x 剪切输入框内容
    driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
    
    # 输入框重新输入内容
    driver.find_element_by_id("kw").send_keys("test")
    
    # 模拟Enter回车键
    driver.find_element_by_id("su").send_keys(Keys.RETURN)
    
    # 清除输入框内容
    driver.find_element_by_id("kw").clear()
    
    # 生成新的页面快照
    driver.save_screenshot("test.png")
    
    # 获取当前url
    print driver.current_url
    
    # 关闭当前页面,如果只有一个页面,会关闭浏览器
    # driver.close()
    
    # 关闭浏览器
    driver.quit()
    

    C#语法——元组类型

            可使用TcpClient类或Socket类来连接TcpListener,并且可以使用IPEndPoint、本地IP地址及端口号来创建TcpListener实例对象。

    一个浏览器肯定会有很多窗口,所以我们肯定要有方法来实现窗口的切换。切换窗口的方法如下:

    我们在做开发的时候,一定接触过父类。父类是干什么的呢?父类通常是用来编写公共属性和函数,方便子类调用的。

    利用UDPClient编程

    7.页面前进和后退

    如代码所示,匿名委托是Lambda表达式,不懂的同学就当它是有固定写法即可,不用讲什么道理,只要记住并应用即可。

            使用C#进行网络编程时,通常都需要用到System.Net命名空间、System.Net.Sockets命名空间和System.Net.Mail命名空间;

    select.deselect_all()
    

    如果他们是同等地位的关键字,为什么可以一起使用呢?

    1. DNS类:DNS是一个静态类,它从Internet域名系统(DNS)检索关于特定主机的信息,在IPHostEntry类的实例中返回来自DNS查询的主机信息。(GetHostName()找到本地系统的主机名,然后再用GetHostByName()找到主机的IP地址)
    2. IPAddress类:包含计算机在IP网络上的地址,主要用来提供网际协议(IP)地址。
    3. IPEndPoint类包含应用程序连接到主机上的服务所需要的主机和本地或远程端口信息。主要用来将网络端点表示为IP地址和端口号。
    4. WebClient类:提供向URL标识的任何本地、Intranet或Internet资源发送数据以及从这些资源接收数据的公共方法。
    5. WebRequest类:.Net Framework的请求/响应模型的抽象基类,用于访问Internet数据。使用该请求/响应模型的应用程序可以用协议不可知的方式从Internet请求数据。

    以上是三种选择下拉框的方式,它可以根据索引来选择,可以根据值来选择,可以根据文字来选择。注意:

    Task taskAction = new Task(() => { });//无入参匿名Action
    taskAction.Start(); 
    Task<int> taskFunc = new Task<int>(() => { return 1; });//无入参匿名Func
    taskFunc.Start();
    int result= taskFunc.GetAwaiter().GetResult();//获取线程返回结果
    
    1 TcpClient tcpClient = new TcpClient();//创建TcpClient对象实例
    2 tcpClient.Connect("www.baidu.com",8080);//建立连接
    
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    import time
    
    driver = webdriver.Firefox()
    driver.get("http://www.douban.com")
    
    # 输入账号密码
    driver.find_element_by_name("form_email").send_keys("158xxxxxxxx")
    driver.find_element_by_name("form_password").send_keys("zhxxxxxxxx")
    
    # 模拟点击登录
    driver.find_element_by_xpath("//input[@class='bn-submit']").click()
    
    # 等待3秒
    time.sleep(3)
    
    # 生成登陆后快照
    driver.save_screenshot(u"douban.png")
    
    driver.quit()
    

    第二核心应用——穿越你的世界:

    TCP与UDP的区别

    • 小莫想要某站上所有的电影,写了标准的爬虫(基于HttpClient库),不断地遍历某站的电影列表页面,根据 Html 分析电影名字存进自己的数据库。

    • 这个站点的运维小黎发现某个时间段请求量陡增,分析日志发现都是 IP(xxx.xxx.xxx.xxx)这个用户,并且 user-agent 还是 Python-urllib/2.7 ,基于这两点判断非人类后直接在服务器上封杀。

    • 小莫电影只爬了一半,于是也针对性的变换了下策略:1. user-agent 模仿百度("Baiduspider..."),2. IP每爬半个小时就换一个IP代理。

    • 小黎也发现了对应的变化,于是在服务器上设置了一个频率限制,每分钟超过120次请求的再屏蔽IP。 同时考虑到百度家的爬虫有可能会被误伤,想想市场部门每月几十万的投放,于是写了个脚本,通过 hostname 检查下这个 ip 是不是真的百度家的,对这些 ip 设置一个白名单。

    • 小莫发现了新的限制后,想着我也不急着要这些数据,留给服务器慢慢爬吧,于是修改了代码,随机1-3秒爬一次,爬10次休息10秒,每天只在8-12,18-20点爬,隔几天还休息一下。

    • 小黎看着新的日志头都大了,再设定规则不小心会误伤真实用户,于是准备换了一个思路,当3个小时的总请求超过50次的时候弹出一个验证码弹框,没有正确输入的话就把 IP 记录进黑名单。

    • 小莫看到验证码有些傻脸了,不过也不是没有办法,先去学习了图像识别(关键词 PIL,tesseract),再对验证码进行了二值化,分词,模式训练之后,总之最后识别了小黎的验证码(关于验证码,验证码的识别,验证码的反识别也是一个恢弘壮丽的斗争史...),之后爬虫又跑了起来。

    • 小黎是个不折不挠的好同学,看到验证码被攻破后,和开发同学商量了变化下开发模式,数据并不再直接渲染,而是由前端同学异步获取,并且通过 JavaScript 的加密库生成动态的 token,同时加密库再进行混淆。

    • 混淆过的加密库就没有办法了么?当然不是,可以慢慢调试,找到加密原理,不过小莫不准备用这么耗时耗力的方法,他放弃了基于 HttpClient的爬虫,选择了内置浏览器引擎的爬虫(关键词:PhantomJS,Selenium),在浏览器引擎运行页面,直接获取了正确的结果,又一次拿到了对方的数据。

    • 小黎:.....

    Selenium

    学会了赋值以后,我开始使用委托。

    1 Socket udpSocket;//创建Socket
    2 udpSocket.Bind(IPAddress,IPEndPoint);//把Socket绑定本地IP和端口号
    3 //开启线程接收信息:先保存接到信息的端口号,使用ReceiveFrom发送信息
    4 EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
    5 EndPoint point = (EndPoint)IPEndPoint;
    6 //发送信息:使用EndPoint创建发送目标的IP和端口号;
    7 //关闭线程和Socket
    

    1.页面操作

    Action与Func是泛型委托,各支持16个入参变量。下面代码为一个入参的定义,多参数以此类推。

    创建连接TCPClient连接方法:

    find_element_by_id
    find_elements_by_name
    find_elements_by_xpath
    find_elements_by_link_text
    find_elements_by_partial_link_text
    find_elements_by_tag_name
    find_elements_by_class_name
    find_elements_by_css_selector
    

    可以说,Action与Func完全包含了,我们日常使用所需的,全部的,委托变量。

    2. System.Net.Sockets命名空间

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    from selenium import webdriver
    
    # 要想调用键盘按键操作需要引入keys包
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver import ActionChains
    
    #创建浏览器对象
    driver = webdriver.Firefox()
    
    driver.get("http://www.baidu.com")
    
    #鼠标移动到某处
    action1 = driver.find_element_by_id("su")
    ActionChains(driver).move_to_element(action1).perform()
    
    #鼠标移动到某处单击
    action2 = driver.find_element_by_id("su")
    ActionChains(driver).move_to_element(action2).click(action2).perform()
    
    #鼠标移动到某处双击
    action3 = driver.find_element_by_id("su")
    ActionChains(driver).move_to_element(action3).double_click(action3).perform()
    
    # 鼠标移动到某处右击
    action4 = driver.find_element_by_id("su")
    ActionChains(driver).move_to_element(action4).context_click(action4).perform()
    

    有没有感觉,这个复杂的变量特别像一个函数的定义。

     3. void Connect(string,int):将客户端连接到指定主机上的指定端口。

    driver.forward()     #前进
    driver.back()        # 后退
    

    注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
    若您觉得这篇文章还不错,请点击下右下角的【推荐】,非常感谢!
    如果您觉得这篇文章对您有所帮助,那就不妨支付宝小小打赏一下吧。 

             由于UDP协议并不需要进行确定的连接,程序中可以不需要考虑连接和一些异常的捕获工作。在有些对数据安全性要求不是很高的情况下采用UDP协议。

    爬虫(Spider),反爬虫(Anti-Spider),反反爬虫(Anti-Anti-Spider) 之间恢宏壮阔的斗争...

    如果需要公共委托,可以采取反射的方式来调用。

    图片 1

    假如有下面的输入框

    没错,官方定义,委托类型的声明与方法签名相似。所以,这个复杂变量,的确,书写的方式就是与函数一样。

     

    操作页面的前进和后退功能:


    (1)创建服务器端:

    遇到下来框需要选择操作时,Selenium专门提供了Select类来处理下拉框

    delegate string anonymousDelegate(int m, long num);
    public static void Excute()
    {
        anonymousDelegate ad = delegate (int m, long num) { return m.ToString() + num.ToString(); };//2.0时代的匿名委托
        anonymousDelegate ad2 = (m, num) => { return m.ToString() + num.ToString(); };//3.0以后匿名委托 
    }
    
    1 socketServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);//创建Socket 客户端
    2 //Socket绑定本地端口监听客户端连接;
    3 Socket.Bind(端口号);
    4 Socket.Listen();
    5 socket.Receive();//创建连接的客户端的Socket并开启线程接收数据;
    6 socket.Send();//发送数据
    7 socket.Close();//关闭连接
    
    # 获取id标签值
    element = driver.find_element_by_id("passwd-id")
    # 获取name标签值
    element = driver.find_element_by_name("user-name")
    # 获取标签名值
    element = driver.find_elements_by_tag_name("input")
    # 也可以通过XPath来匹配
    element = driver.find_element_by_xpath("//input[@id='passwd-id']")
    

    答案当然是,可以的。

     

    寻找方法

    重要的话要讲三遍。

    (1)创建一个TcpClient,并调用3个可用Connect方法之一。

    下载selenium webdriver ‘geckodriver.exe’,下载好后放到python目录里面

    所以,理论上,只要我们利用好委托,就可以大量减少冗余的代码。

    Server:获取基础网络Socket

     动态页面模拟点击--->>>爬取斗鱼所有房间名,观众人数

    (1)首先分析‘’下一页‘’的class变化,如果不是最后一页的时候,‘下一页’的class如下

     图片 2

    (2)如果到了最后一页,‘下一页’变为隐藏,点击不了,class变为如下

    图片 3

    (3)找到个房间的名字和观众人数的class

    图片 4

    (4)代码

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import unittest
    from selenium import webdriver
    from bs4 import BeautifulSoup as bs
    
    class douyu(unittest.TestCase):
        # 初始化方法,必须是setUp()
        def setUp(self):
            self.driver = webdriver.Firefox()
            self.num = 0
            self.count = 0
    
        # 测试方法必须有test字样开头
        def testDouyu(self):
            self.driver.get("https://www.douyu.com/directory/all")
    
            while True:
                soup = bs(self.driver.page_source, "lxml")
                # 房间名, 返回列表
                names = soup.find_all("h3", {"class" : "ellipsis"})
                # 观众人数, 返回列表
                numbers = soup.find_all("span", {"class" :"dy-num fr"})
    
                # zip(names, numbers) 将name和number这两个列表合并为一个元组 : [(1, 2), (3, 4)...]
                for name, number in zip(names, numbers):
                    print u"观众人数: -" + number.get_text().strip() + u"-t房间名: " + name.get_text().strip()
                    self.num += 1
                    #self.count += int(number.get_text().strip())
    
                # 如果在页面源码里找到"下一页"为隐藏的标签,就退出循环
                if self.driver.page_source.find("shark-pager-disable-next") != -1:
                        break
    
                # 一直点击下一页
                self.driver.find_element_by_class_name("shark-pager-next").click()
    
        # 测试结束执行的方法
        def tearDown(self):
            # 退出Firefox()浏览器
            print "当前网站直播人数" + str(self.num)
            print "当前网站观众人数" + str(self.count)
            self.driver.quit()
    
    if __name__ == "__main__":
        # 启动测试模块
        unittest.main()
    

    爬取的结果:

    图片 5

     

    那么委托到底是如何流动的呢?

            .Net中的TcpListener主要作用是监视TCP端口上客户端的请求,通过绑定本机IP地址和相应端口创建TcpListener对象实例,并由Start方法启动侦听;当TcpListener侦听到用户端的连接后,通过AcceptTcpClient方法接受传入的连接请求并创建TcpClient以处理请求,或者通过AcceptSocket方法接受传入的连接请求并创建Socket以处理请求。

    实例 模拟登陆douban网站

    首先,我们创建父类代码如下:

    使用UdpClient类实现UDP协议编程

    4.Select表单

    委托的定义

    Socket建立服务器:初始化监听Socket   接受新的客户端连接   收发数据   关闭连接

    Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用.

    下面来看最简单的Action与Func的定义:

    网络编程

    5.弹窗处理

    那就是——引用类型的函数。

            注:要创建NetworkStream必须提供连接的Socket.默认情况下关闭NetworkStream并不会关闭所提供的Socket.如果要关闭Socket权限,则必须将ownsSocket构造函数参数的值指定为true.而后的数据读取及写入均针对这个通道来进行。不支持对网络流的随机访问。

    • index 索引从 0 开始
    • value是option标签的一个属性值,并不是显示在下拉框中的值
    • visible_text是在option标签文本的值,是显示在下拉框的值

    本文由金沙国际官网发布于编程,转载请注明出处:架构的血液,python爬虫入门

    关键词: