zoukankan      html  css  js  c++  java
  • 爬虫一

    1、爬虫前奏
    ①URL详解
    scheme:代表是访问的协议,一般为http或者是https以及ftp等:
    host:主机名
    port:端口号
    path:查找路径
    query-string:查询字符串,
    anchor:锚点,后台一般不管,前端用来做页面定位的。

    ②http协议
    常用的方法有get请求与post请求。
    get请求:一般情况下,只从服务器获取数据下来,并不会对服务器资源产生任何影响。
    post请求:向服务器发送数据,上传文件等,会对服务器产生影响

    ③请求头常见参数
    User-Agent:浏览器名称。
    Referer:表面当前这个请求是从哪个URL过来的。
    Cookie:http协议是无状态的。

    ④常见响应状态码
    200:请求正常,服务器正常返回数据
    301:永久重定向。
    302:临时重定向。
    400:请求的URL在服务器上找不到。
    403:服务器拒绝访问,权限不够。
    500:服务器内部错误。可能服务器出现bug了。

    2、网络请求
    ①urllib库
    在Python3中,所有与网络请求相关的方法都被集成到了urllib.request模块下面了。

    ②urlopen函数:
    from urllib import request
    resp = request.urlopen('http://www.baidu.com')#用.urlopen函数访问网页
    print(resp.read())#用.read(size)方法将网页的所有内容读取出来
    url:请求的url
    data:请求的data,如果设置了这个值,那么将变成post请求。
    返回值:read(size)默认读取所有信息,readline()默认读取一行信息,readlines()读取多行信息,gercode()是获取当前网页的状态码

    ③urlretrieve函数:
    这个函数可以将网页上的一个文件保存到本地。
    from urllib import request
    resp = request.urlretrieve('http://www.baidu,.com/','baidu.html')#urlretrieve('网站地址','保存的名字')可以非常方便的获取图片或网页页面。

    ④urlencode函数和parse_qs函数:
    这两个模块实在urllib.parse模块下的。
    #urlencode()用于将中文和特殊符号进行编码。
    from urllib import parse
    params = {'name':'小白','age':'18','greet':'hello'}
    result = parse.urlencode(params)
    print(result)
    结果:name=%E5%B0%8F%E7%99%BD&age=18&greet=hello

    #parse_qs()用于将解码。
    from urllib import parse
    params = {'name':'小白','age':'18','greet':'hello'}
    qs = parse.urlencode(params)
    result = parse.parse_qs(qs)
    print(result)
    结果:{'name': ['小白'], 'age': ['18'], 'greet': ['hello']}

    ⑤urlparse函数和urlsplit函数:
    用于将解析网址的函数,也是在urllib.parse模块下的。
    from urllib import parse
    #urlparse函数和urlsplit函数
    url ='https://www.baidu.com/s?wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B&rsv_spt=1&rsv_iqid=0x8644922000021612&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=06074089_36_pg&rsv_enter=1&rsv_dl=ib&rsv_sug3=5&rsv_sug1=1&rsv_sug7=100'
    # result = parse.urlparse(url)
    result = parse.urlsplit(url)#区别在于urlsplit函数没有params
    print(result)
    print('scheme:',result.scheme)
    print('netloc:',result.netloc)
    print('path:',result.path)
    # print('params:',result.params)
    print('query:',result.query)
    print('fragment:',result.fragment)

    ⑥request.Request类
    例如:
    from urllib import request,parse

    url = 'https://www.cnblogs.com/wu-wu/category/1488072.html'#网页地址

    headers ={
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'
    }#网页的请求头

    req = request.Request(url,headers = headers)#导入网页地址和请求头,以浏览器身份请求网页
    resp = request.urlopen(req)#打开网页地址
    print(resp.read().decode('utf-8'))#将请求的内容解码回来并打印出来

    ⑦ProxyHandler处理器(代理设置)
    from urllib import request

    url = 'http://httpbin.org/ip'#查看自己IP的网站
    handler = request.ProxyHandler({"https":"117.57.90.25:9999"})#设置代理网站
    opener = request.build_opener(handler)#打开代理网站
    # req = request.Request("http://httpbin.org/ip")
    resq = opener.open(url)
    print(resq.read())

    ⑧cookie原理及格式详情
    cookie是可以用于存储登录信息,cookie能存储信息比较小。
    #cookie的格式:Set-Cooker: NAME=VALUE: Expires/Max-age=DATH: Domain=DOMAIN_MAME:SECURE
    #NAME:cookie的名字。
    #VALUE:cookie的值。
    #Expires:cookie的过期时间。
    #Path:cookie作用的路径。
    #Domain:cookie作用的域名。
    #SECURE:是否只在https协议下起作用。

    ⑨cookie 模拟登录
    from urllib import request

    url = 'https://www.cnblogs.com/'

    headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
    "cookie":"_ga=GA1.2.1000081871.1564917076; __gads=ID=bb1d9716962a6860:T=1564975837:S=ALNI_MbVG3G2dcIKXSXxurKKe5iO6IWHWA; .Cnblogs.AspNetCore.Cookies=CfDJ8DeHXSeUWr9KtnvAGu7_dX-AytKAwHwN4y3UUIBU1EbRva5IDlRvpDrHugXNjaVki8tfaRWspxWeHF63Pt55AES0yBNEXKbmnXR8mY_FZO4MHTK5InVChdxgA2j7e4t-O7wfLoHpfTFuXhVSdh1ui2sNU_04KWrxA5bEqNM22AnBLf20ST9eTo4KRPLE7YwW8V2g1d_ATSJDNYmfjiIj943KAyYAOyfW-YGlkyI9TrXTk6WYrxB9HHVaBFD6tC3RTlhNP_tEZqtHiYOxcgO628qCG5gR7im15EpZy-TKP4EhgEqGQBjIiMqOV4KV6vATpUN7OvoOkl-SGTUiCMBBT3WyH4s6NBQN8q116QQ1IH0DMhMdl98G8UzcwLtGibtdhgmg8wvJ878yG2wfHORQAA58yajD8wA5NjjZBfwyyROnAJI5l4ep911YNyUW0MTYC615_5qKJ-ADq6510cfxTpo; .CNBlogsCookie=191DA8F2560020F7B2FFE700ADE7182A6C3FFFD67AD8271E0930A5EFBBEF16CE45618DF55908A3BC13106870EDC576487E8204716B56647199A2E5385246C81D3275319AB63957E5DF1FA243276F458BFE2E8ECB; _gid=GA1.2.1150744539.1571561207"
    }#cookie模仿浏览器存储账号和密码的

    req = request.Request(url=url,headers=headers)#传入网页地址和头文件内容
    resp =request.urlopen(req)#用于打开网页
    with open('bokeyuan.html','w',encoding='utf-8') as fp:#用文件存储的方式将获得的内容写入文件中
    #write函数必须写入一个str的数据类型,但的到的网页一般是bytes(二进制)的数据类型,所以需要用decode解码
    fp.write(resp.read().decode('utf-8'))

    ⑩http.cookiejar模块
    #Cookicjar:管理HTTP cookie的值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象
    #FileCookiejar:从Cookicjar派生而来,用来创建FileCookiejar实例,检索cookie信息并将cookie存储到文件中
    #MozillaCookiejar:创建Mozilla浏览器 cookie.txt兼容的FileCookiejar实例
    #LWPCCookiejar:创建libwww.perl标准的Set-Cookie3文件的格式兼容的FileCookiejar
    from urllib import request,parse
    from http.cookiejar import CookieJar

    headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36",
    }
    def get_opener():
    cookiejar = CookieJar()#创建一个cookiejar对象
    handler =request.HTTPCookieProcessor(cookiejar)#使用cookiejar创建一个HTTPCookieProcessor对象
    opener = request.build_opener(handler)#使用上一步创建的hanler创建opener
    return opener

    def login_boke(opener):
    data ={
    "Loginname":"用户名",
    "Password":"密码"
    }
    login_url ="https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F"
    req = request.Request(login_url,data=parse.urlencode(data).encode('utf-8'),headers=headers)
    opener.open(req)#使用opener发送登录的请求(登录界面的登录账号和登录密码)

    def visit_profile(opener):
    zhu_url = "https://www.cnblogs.com/"#访问主页面
    req =request.Request(zhu_url,headers=headers)
    resp = opener.open(req)
    with open('boke.html','w',encoding='utf-8') as fp:
    fp.write(resp.read().decode('utf-8'))

    if __name__ =='__main__':
    opener= get_opener()
    login_boke(opener)
    visit_profile(opener)

  • 相关阅读:
    Android 编程下 Eclipse 恢复被删除的文件
    Android 编程下背景图片适配工具类
    Android 编程下 Managing Your App's Memory
    Android 编程下代码之(QQ消息列表滑动删除)
    Android 编程下 Canvas and Drawables
    Android 编程下 AlarmManager
    Android 编程下去除 ListView 上下边界蓝色或黄色阴影
    Java 编程下字符串的 16 位、32位 MD5 加密
    C#枚举类型和int类型相互转换
    MVC和普通三层架构的区别
  • 原文地址:https://www.cnblogs.com/dcpb/p/11715881.html
Copyright © 2011-2022 走看看