zoukankan      html  css  js  c++  java
  • [Python爬虫笔记][随意找个博客入门(一)]

    [Python爬虫笔记][随意找个博客入门(一)]

    标签(空格分隔): Python 爬虫 2016年暑假

    来源博客:挣脱不足与蒙昧

    1.简单的爬取特定url的html代码

    import urllib.request
    url = "http://120.27.101.158/"
    response = urllib.request.urlopen(url)
    html = response.read()
    html = html.decode('utf-8');
    print  (html)
    
    • urllib.request.urlopen()
      • 有点类似于文件操作里的open,返回的response对象也类似与文件对象。
      • 等价于
        req = urllib.request.Request("http://placekitten.com/500/600")
        response = urllib.request.urlopen(req)
        
        
    • response.read()
      • response对象的读操作,类似的文件对象的读操作.
      • 该对象还有以下常用方法
        response.geturl()  ##访问的具体地址。
        response.info() ##远程的服务器的信息
        response.getcode() ##http的状态    
        
        
    • html.decode()
      • decode() 方法以encoding指定的编码格式解码字符串。

    2.简单的翻译程序(爬取有道词典)

    • 在我们注册信息的时候,填写资料的时候,都涉及到表单(form)的应用。 是一个POST请求发送到服务器端的过程。 HTML中的表单时有特定格式的,举个例子,我们打开有道在线翻译,调出调试平台,输入翻译内容“Hello,Python”点击自动翻译。

    此处输入图片的描述

    • 在调试平台中的network中我们可以看到一些常见的信息
    • 如访问的具体的url地址,http的状态(200)
      1.png-24.5kB
    • 在参数栏(FireFox)可以看见提交的表单信息(json格式)
      image_1am7sm96r2fp18k729e1cjqlb0l.png-27.8kB
    • 在响应栏,可以知道返回的表单信息也是json格式

    用字典传入一个json并提交表单,并解析返回来html里的json,代码如下。

    
    import urllib.request
    '''urllib中的parse用来对url解析'''
    import urllib.parse 
    import json
    
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null/'
    content = input("你想翻译什么呀?")
    
    data = {}
    data['type']='AUTO'
    data['i'] = content
    data['doctype'] = 'json'
    data['xmlVersion'] = '1.8'
    data['keyfrom'] = 'fanyi.web'
    data['ue'] = 'UTF-8'
    data['typoResult'] = 'true'
    data = urllib.parse.urlencode(data).encode('utf-8')
    
    response = urllib.request.urlopen(url, data)
    html=response.read().decode('utf-8')
    
    target =json.loads(html)
    
    print ("翻译结果是:%s" %(target['translateResult'][0][0]['tgt']))
    
    

    结果

    > print (target)
    
    {'translateResult': [[{'src': '测试程序', 'tgt': 'The test program'}]], 'elapsedTime': 0, 'errorCode': 0, 'smartResult': {'entries': ['', '[计] test program'], 'type': 1}, 'type': 'ZH_CN2EN'}
    

    我们看到翻译的内容在translateResult[0][0][‘tgt’]中

    image_1am7v0alo1ohl1ucj1sui1eqislt19.png-9.9kB

    • data = urllib.parse.urlencode(data).encode('utf-8')

      • 将字典转换为能够post,get进行的字符串,对于中文编码为默认格式的字符串。

      • encode将该字符串转换为一个字节序列。(从下面程序可以看出其实这个utf-8没什么卵用,换成gbk还会是一样的结果)

      data
      {'type': 'AUTO', 'ue': 'UTF-8', 'typoResult': 'true', 'i': '程序测试', 'xmlVersion': '1.8', 'keyfrom': 'fanyi.web', 'doctype': 'json'}
      data = urllib.parse.urlencode(data); #dict转换为str
      'type=AUTO&ue=UTF-8&typoResult=true&i=%E7%A8%8B%E5%BA%8F%E6%B5%8B%E8%AF%95&xmlVersion=1.8&keyfrom=fanyi.web&doctype=json'
      data = data.encode('utf-8'); #str转换为byte序列
      b'type=AUTO&ue=UTF-8&typoResult=true&i=%E7%A8%8B%E5%BA%8F%E6%B5%8B%E8%AF%95&xmlVersion=1.8&keyfrom=fanyi.web&doctype=json'

      
      
    • response = urllib.request.urlopen(url, data)

      • 传入的data必须为byte型字符串
    • html=response.read().decode('utf-8')

      • 将接收来的utf-8页面解码为unicode
    • target =json.loads(html)

      • 这个页面应该是一个json,将其转换为字典

    3.小模仿,爬谷歌翻译

    import re
    import urllib.parse
    import urllib.request
    
    #----------模拟浏览器的行为,向谷歌翻译发送数据,然后抓取翻译结果,这就是大概的思路-------
    def Gtranslate(text):
        Gtext=text     #text 输入要翻译的英文句子
        #hl:浏览器、操作系统语言,默认是zh-CN
        #ie:默认是UTF-8
        #text:就是要翻译的字符串
        #langpair:语言对,即'en'|'zh-CN'表示从英语到简体中文
        values={'hl':'zh-CN','ie':'UTF-8','text':Gtext,'langpair':"auto"}
        url='http://translate.google.cn/'     #URL用来存储谷歌翻译的网址
        data = urllib.parse.urlencode(values).encode("utf-8")    #将values中的数据通过urllib.urlencode转义为URL专用的格式然后赋给data存储
        req = urllib.request.Request(url,data)     #然后用URL和data生成一个request
        browser='Mozilla/4.0 (Windows; U;MSIE 6.0; Windows NT 6.1; SV1; .NET CLR 2.0.50727)'     #伪装一个IE6.0浏览器访问,如果不伪装,谷歌将返回一个403错误
        req.add_header('User-Agent',browser)
        response = urllib.request.urlopen(req)     #向谷歌翻译发送请求
        html=response.read()     #读取返回页面,然后我们就从这个HTML页面中截取翻译过来的字符串即可
        html=html.decode('utf-8')
        #使用正则表达式匹配<=TRANSLATED_TEXT=)。而翻译后的文本是'TRANSLATED_TEXT='等号后面的内容
        p=re.compile(r"(?<=TRANSLATED_TEXT=).*(?=';INPUT_TOOL_PATH='//www.google.com')")
        m=p.search(html)
        chineseText=m.group(0).strip(';')
        return chineseText
    
    if __name__ == "__main__":
        #Gtext为待翻译的字符串
        Gtext='我是上帝'
        print('The input text: %s' % Gtext)
        chineseText=Gtranslate(Gtext).strip("'")
        print('Translated End,The output text: %s' % chineseText)
      
    
    • 实际的爬虫十分麻烦,要考虑是否被屏蔽,还有登陆等等问题。待继续好好学习。

    • 几个资料

    Python网络爬虫(Get、Post抓取方式)
    py爬取英文文档学习单词
    python网络爬虫入门(二)——用python简单实现调用谷歌翻译

  • 相关阅读:
    xcode构建webdriverAgent时报错Messaging unqualified id的解决办法
    ubuntu18.0安装RabbitMQ
    python中*的用法
    Jenkins构建项目
    Jenkins安装与配置
    git_仓库
    六、 Shell数组应用
    五、 Shell函数应用
    三、 Shell流程控制
    二、 Shell变量定义
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5622062.html
Copyright © 2011-2022 走看看