zoukankan      html  css  js  c++  java
  • python之爬虫

    一、爬虫的概念

      爬虫:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOA社区中间,更经常的称为网页追逐者)是一种按照一定规则,自动抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

      申明:爬虫也是只能爬取公开网站,公开的数据,别人加密的,涉及隐私的,不能随便弄。

      推荐使用requests模块进行爬虫。安装模块:pip install requests

    二、requests模块

      1.requests需要传输的很多参数,都是通过字典的形式进行传递。

      http定义的与服务器交互的几种方法:

      get    仅仅获取资源的信息,不增加或修改数据

      post  一般提交到服务器上的资源,一般我们通过form表单进行提交请求

      put   增加

      delete  删除

      例子如下:

    import  requests
    requests.get("http://www.baidu.com")
    requests.post("http://www.jd.com")
    requests.put("http://www.jd.com")
    requests.delete("http://www.jd.com")

      使用get方法传递参数

    params = {'key1':'hello','key2':'world'}
    url = 'http://www.jd.com'
    r = requests.get(url=url,params=params)
    print(r.url)

      使用post方法传递参数

    params = {'key1':'hello','key2':'world'}
    url = 'http://httpbin.org/post'
    r = requests.post(url=url,data=params)
    print(r.text)

      http://httpbin.org/post是requests提供的官网网址,通过json的方式给大家返回。可以看到我们返回的数据。Post的数据参数是data,都是字典的类型,但是urllib就没法接受字典类型,必须是字符串。

       2.响应http请求

    url = 'https://www.qiushibaike.co/'
    r = requests.get(url = url)
    print(r.text)
    print(r.encoding)
    
    print(type(r.text))
    print(type(r.context))

      requests中text和content的返回值不相同,text返回的是str类型的数据,content返回的是bytes型的数据也就是二进制的数据。也就是说,如果想取文本,可以通过text。想取图片、文字,则可以通过content

      3.requests的其他常用的方法

      headers:头信息

      request:

      cookies:

      status_code:http状态码

      4.requests模块有时候需要更改头信息,可以通过定义一个list,然后通过random模块随机取一个header信息进行访问,防止反爬虫的操作

      5.requests的会话对象

    s = requests.session()
    S = requests.Session()

      所有一次会话的信息都保存在s中,只需要对s进行操作就可以了。如:s.get(url)

     6.Cookie的常用属性:

      Domain  域

      path       路径

      Expires  过期时间

      name     对应的key值

      value     key对应的value值

      cookie中domain代表的是cookie所在的域,默认情况下就是请求的域名,例如请求http://www.server1.com/files/hello,那么响应中的set-cookie默认会使用www.server1.com作为cookie的domain,在浏览器中也是按照domain来阻止cookie的。我们可以在响应中设置cookie的domain为其他域,但是浏览器并不会保存这些domain为其他域的cookie。

      cookie中的path能够进一步的控制cookie的访问,当path=/;当前域的所有请求都可以访问到这个cookie。如果path设为其他值,比如path=/test,那么只有/test下面请求可以访问到这个cookie。

      7.requests的代理访问

      代理访问:采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性

    三、urllib模块

      urllib在Python2与Python3中的区别,在Python2中,urllib和urllib2各有各个的功能,虽然urllib2是urllib的升级版,但是urllib2还是不能完全替代urllib,但是在Python3中,全部封装成一个类。urllib可以接受一个request对象,并以此可以来设置一个URL的headers,但是urllib只接受一个url。这就意味着你不能通过urllib伪装请求头

      urllib模块可以提供运行urlencode的方法,该方法用于get查询字符串的生成,urllib2的不具备这样的功能,而且urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。这就是urllib和urllib2一起使用的原因。quote用来url转码的

    import urllib.request
    urllib.request.Request(url, data=None, headers = {}, method= None)
    
    headers = {
          'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                        'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
          'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
          'Connection': 'keep-alive'
     }

      1.requests如果要发送data,并无法直接传入字典类型的参数,需要进行数据转换,你可以直接使用类似于get传出参数的方法,也可以使用urllib给我们提供类 

    data = {
        'first': 'true',
        'pn': 1,
        'kd': 'Python'
    }
    data = parse.urlencode(data).encode('utf-8')
    print(data)
    结果:
    b'first=true&pn=1&kd=Python‘
    urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)

      urlencode()主要作用是将url附上要提交的数据。post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码

      2.urllib.request.urlopen(url, data=None, timeout=None)
      url  需要打开的网站

      data post提交的数据

      timeout 网站访问的超时时间

      但是无法伪装头信息

    from urllib import request
    req = request.Request(url, headers=headers, data=data)
    html = request.urlopen(req).read()

      3.urllib的下载

    from urllib import request
    
    url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
    request.urlretrieve(url, "1.jpg")
    
    或者通过
    from urllib import request
    
    url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
    req = request.Request(url)
    res = request.urlopen(req)
    text = res.read()
    with open("2.jpg", "wb") as f:
        f.write(text)

      4.urllib代理

    from urllib import request, parse
    
    data = {
            'first': 'true',
            'pn': 1,
            'kd': 'Python'
        }
    url = 'http://2017.ip138.com/ic.asp'
    
    proxy = request.ProxyHandler({'http': '112.95.61.146:8118'})  # 设置proxy
    opener = request.build_opener(proxy)  # 挂载opener
    # opener = request.build_opener()  # 挂载opener
    request.install_opener(opener)  # 安装opener
    data = parse.urlencode(data).encode('utf-8')
    page = opener.open(url, data).read()
    print(type(page))
    print(page.decode("gbk"))
    
    结果:<body style="margin:0px"><center>您的IP是:[112.95.61.146] 来自:广东省深圳市 联通</center></body></html>

      5.urllib的cookie使用:

      如果已经知道cookie,或者说是通过抓包获取到的cookie,直接放在header的信息中直接登录就可以。登录京东的网站的cookie信息和不登录京东的cookie信息是不一样的。登录京东以后,抓取cookie的信息,然后访问任何网站就可以了。‘

    import urllib.request
    url = “http://www.jd.com"
    header = {"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
              "cookie": "xxxxx"}
    req = urllib.request.Request(url=url, headers=header)
    res = urllib.request.urlopen(req)
    text = res.read()

      6.urllib的cookie相关的类

      在Python2中的cookie的类叫做:import cookielib

      在Python3中的cookie的类叫做:import http.cookiejar

      opener:当获取一个url使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,都是使用默认的opener,也就是urlopen。urlopen是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是urldata,timeout。如果需要使用cookie,只用这个opener是不可能达到目的的,所以需要创建更一般的opener来实现对cookie的设置。

      7.终端输出cookie对象

    import urllib.request
    import http.cookiejar
    
    url = "http://www.hao123.com"
    req = urllib.request.Request(url)
    cookiejar = http.cookiejar.CookieJar()
    handler = urllib.request.HTTPCookieProcessor(cookiejar)
    opener = urllib.request.build_opener(handler)
    r = opener.open(req)
    print(cookiejar)
    <CookieJar[<Cookie BAIDUID=93B415355E0704B2BC94B5D514468898:FG=1 for .hao123.com/>, <Cookie hz=0 for .www.hao123.com/>, <Cookie ft=1 for www.hao123.com/>, <Cookie v_pg=normal for www.hao123.com/>]>

      8.cookie保存到文件中

    import urllib.request
    import http.cookiejar
    
    url = "http://www.hao123.com"
    req = urllib.request.Request(url)
    
    cookieFileName = "cookie.txt"
    cookiejar = http.cookiejar.MozillaCookieJar(cookieFileName)#文件cookie
    handler = urllib.request.HTTPCookieProcessor(cookiejar)
    opener = urllib.request.build_opener(handler)
    r = opener.open(req)
    print(cookiejar)
    cookiejar.save()
    保存在了文件cookie.txt中
    
    
    
    MozillaCookieJar继承FileCookieJar()继承CookieJar

      9.cookie从文件中读取cookie信息并访问

    import urllib.request
    import http.cookiejar
    cookie_filename = 'cookie.txt'
    cookie = http.cookiejar.MozillaCookieJar(cookie_filename)
    cookie.load(cookie_filename, ignore_discard=True, ignore_expires=True)
    print(cookie)
    url = "http://www.hao123.com"
    req = urllib.request.Request(url)
    handler = urllib.request.HTTPCookieProcessor(cookie)
    opener = urllib.request.build_opener(handler)  # 利用urllib2的build_opener方法创建一个opener
    response = opener.open(req)
    
    print(response.read().decode(“utf-8”))#解决乱码的问题

    四、webdriver

      selenium是ThroughtWorks公司开发的一套web自动化测试工具。它分为三个组件:

      selenium IDE:是Firefox的一个插件,允许测试人员录制脚本并回放

      selenium RC(Remote Control)

      selenium Webdriver

      selenium RC和selenium Webdriver是测试框架,提供多种语言的api。不同的是,selenium webdriver以一种更底层、更灵活的方式来操作浏览器,并不仅仅使用JavaScript。这样它可以绕开浏览器的沙箱限制,实现selenium RC不支持的框架、弹出窗口、页面导航、下拉菜单、基于ajax的UI元素等控件的操作。以及,selenium webdriver不需要本地服务器。selenium1.x版本只包含前两个组件。从2.0开始webdriver加入其中。主要用来解决https的加密问题。

      webdriver在使用之前,需要下载一个浏览器所对应用的驱动插件。请根据自己不同的浏览器版本,进行下载。谷歌浏览器下载地址:链接:https://pan.baidu.com/s/1qZ2LfmW

      密码:qixa

      下载以后,把Chromedriver放在google.exe那个当前目录下面

    import os
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    chromedriver = "C:Program Files (x86)GoogleChromeApplicationchromedriver.exe"
    os.environ["webdriver.chrome.driver"] = chromedriver
    driver = webdriver.Chrome(chromedriver)
    
    driver.get("http://www.python.org")
    driver.quit()

      八种选择器:

      1. find_elements_by_name(“test”)
      页面:
      <input type="text" name="passwd" id="passwd-id"  class=”input-class”/>
      代码:
      element = driver.find_elements_by_name(“passwd”)

      2. find_elements_by_id()
      element = driver.find_element_by_id(“passwd-id”)
          By.tagname()
      element = driver.find_element_by_tagname(“input”)

      3. find_element_by_class_name(‘input-class’)
      4. find_elements_by_tag_name(‘iframe’)

      DOM的Tag元素

      用Tag name 定位元素的例子:
      <iframe src="..."></iframe>

      element = driver.find_elements_by_tag_name("iframe")
      5. find_element_by_link_text()
      页面:
      <a href="http://www.google.com/search?q=baidu">baidu</a>
      代码:
      element = browser.find_elements_by_link_text("baidu")
      6 xpath   这个特别强大,所有的元素都可以通过这个可以找到。
      XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。
      绝对路径: 根元素开始,及html开始用/      
      相对路劲: 任意符合条件的元素 //
      查找页面上所有的input元素://input
      查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input
      查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input
      查找页面上第一个form元素://form[1]
      查找页面上id为loginForm的form元素://form[@id='loginForm']
      查找页面上具有name属性为username的input元素://input[@name='username']
      查找页面上id为loginForm的form元素下的第一个input元素://form[@id='loginForm']/input[1]
      查找页面具有name属性为contiune并且type属性为button的input元素://input[@name='continue'][@type='button']
      查找页面上id为loginForm的form元素下第4个input元素://form[@id='loginForm']/input[4]

      

      控件操作:

      输入框

    element.clear()  清空输入框数据
    element.sendkeys(“username”)   发送数据
    element.text         获取文本的值

      按钮

    element.click()

      表单提交

    element.submit()

      单选和多选框

    element.clear()
    element = browser.find_elements_by_id(' checkbox')

      选择某个单选项

    element.click();

      常用方法:

      browser.get_cookies()
      browser.title           头名字
      browser.close()
      forward()
      前进,browser.foeward()
      .back()
      后退,browser.back()
      .refresh()
      刷新,browser.refresh()
      .current_url
      返回当前页面url,browser.current_url
      

      实例:登录12306

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2018/1/20 18:33
    # @Author  : lingxiangxiang
    # @File    : demon9.py
    
    from selenium import webdriver
    
    import random
    import time
    
    def randomSleep(minS, maxS):
        time.sleep((maxS - minS) * random.random() + minS)
    browser = webdriver.Chrome(r"C:Program Files (x86)GoogleChromeApplicationchromedriver.exe")
    
    url = "https://kyfw.12306.cn/otn/login/init"
    
    browser.get(url=url)
    print(browser.find_element_by_id("username").text)
    browser.find_element_by_id("username").clear()
    browser.find_element_by_id("username").send_keys("974644081@qq.com")
    randomSleep(2, 5)
    browser.find_element_by_id("password").send_keys(“xxxxxxxxx")
    randomSleep(1, 4)
    time.sleep(6)
    browser.find_element_by_id("loginSub").click()
    randomSleep(2, 5)
    print(browser.get_cookies())
    browser.quit()

      实例:登录京东

    from selenium import webdriver
    
    import random
    import time
    
    def randomSleep(minS, maxS):
        time.sleep((maxS - minS) * random.random() + minS)
    browser = webdriver.Chrome(r"C:Program Files (x86)GoogleChromeApplicationchromedriver.exe")
    # browser = webdriver.Chrome()
    
    # Home
    browser.get("https://passport.jd.com/new/login.aspx")
    
    # Login by username and password
    randomSleep(1, 2)
    browser.find_element_by_xpath("//a[@clstag='pageclick|keycount|201607144|2']").click()
    # browser.find_element_by_tag_name("pageclick|keycount|201607144|2").click()
    
    # Username and password
    randomSleep(1, 2)
    browser.find_element_by_id("loginname").send_keys(“xxxxxxx")
    print(browser.find_element_by_id("loginname").text)
    
    randomSleep(1, 3)
    browser.find_element_by_id("nloginpwd").send_keys(“xxxxxx")
    
    # Submit, wait for a long time
    randomSleep(5, 10)
    browser.find_element_by_id("loginsubmit").click()
    
    
    print(browser.get_cookies())
    randomSleep(3, 5)
    
    
    browser.quit()
  • 相关阅读:
    求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
    3,具体例子
    二十八.享元模式
    三十一.设计模式总结创建型模式
    1,学习LinQ
    软件公司需要具备什么能力的大学毕业生?
    二十九.解释器模式
    三十三.设计模式总结行为型模式
    三十二.设计模式总结结构型模式
    三十.访问者模式
  • 原文地址:https://www.cnblogs.com/huangdongju/p/8303024.html
Copyright © 2011-2022 走看看