• 【Python】第十二课 网络爬虫


    本章主要讲的是基于Python语言的数据采集,该功能要讲起来可以单独作为一门课程来学习,因为这是一门很重要的课程,一般运用在大数据处理和人工智能上,该应用提供大量的数据。

    12.1 urllib模块的学习

    urllib模块是python提供给我们操作互联网的模块。接下来我们可以简单的操作一下,爬取一个网页的源代码,其实就是审查元素的操作。urllib中分为四部分:1.request 2.error 3.parse 4.robotparser

    request是urllib中最重要的也是最复杂的。

    1. # 网络爬虫
    2. # 导入模块
    3. import urllib.request as req
    4. # 爬取该地址的网页源码
    5. res=req.urlopen(r"https://www.baidu.com")
    6. # 从爬取的内容中读取信息
    7. html=res.read()
    8. # 读取的信息是字节,需要通过编码格式的转换,才能获得和网页上审查元素的源代码一致
    9. html=html.decode("UTF-8")
    10. print(html)

    输出结果:

    12.2 实战

    12.2.1 爬取图片

    这里我们来访问一下百度图片,其网站效果如图:

    那我们一般想要某张图片,需要把鼠标移动到图片上点击右键,然后图片另存为……到我们电脑的指定的磁盘路径下。接下来看看我们python怎么通过代码来爬取想要的图片。我们先来看看这个图片对应的访问地址,右键复制图片访问地址,粘贴到地址上访问一下,是否能正常访问  

     即通过地址的访问,可以查看某一张图片,那么我们来通过python爬虫来爬取这张图片。

    1. # 导入模块
    2. import urllib.request as req
    3. #指定猫的访问地址
    4. res=req.urlopen("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2F1113%2F052420110515%2F200524110515-2-1200.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1662537204&t=69f97612ad5cfcc28f60537007447873")
    5. # 将猫图片读取,字节保存
    6. cat_img=res.read()
    7. # 指定一个本地路径,用于存储图片,并允许写入字节
    8. f=open("cat_200_287.jpg","wb")
    9. #将图片存储
    10. f.write(cat_img)

    执行完成后,可发现项目路径下已经将该图片爬取了。

    12.2.2 在线文本翻译

    打开浏览器访问有道翻译的网站在线翻译_有道

     接着我们右键审查元素,切换到network,查看其网络的请求和响应信息

     单击这个响应请求,查看其翻译信息

    查看响应头信息

    浏览器一般通过以下信息来判断是否是机器访问,而非人为正常操作。  

    如果使用python访问的该地址的话,User-Agent会被定义为Python-urllib/版本号

    刚通过观察浏览器的返回结果:{"errorCode":0,"translateResult":[[{"tgt":"I'm a teacher","src":"我是一名老师"}]],"type":"zh-CHS2en"}

    那么这个格式是json格式,由{}和[]混合使用构建成,中间形成键值对并以冒号隔开key和value。

    1. # -*- coding:utf-8 -*-
    2. '''
    3. 使用 POST 方式抓取 有道翻译
    4. urllib2.Request(requestURL, data=data, headers=headerData)
    5. Request 方法中的 data 参数不为空,则默认是 POST 请求方式
    6. 如果 data 为空则是 Get 请求方式
    7. {"errorCode":50}错误:
    8. 有道翻译做了一个反爬虫机制,就是在参数中添加了 salt 和 sign 验证,具体操作说明参考:
    9. http://www.tendcode.com/article/youdao-spider/
    10. '''
    11. import urllib.request
    12. import urllib.parse
    13. import time
    14. import random
    15. import hashlib
    16. import sys
    17. # 字符串转 utf-8 需要重新设置系统的编码格式
    18. def reload(sys):
    19. sys.setdefaultencoding('utf8')
    20. # 目标语言
    21. targetLanguage = 'Auto'
    22. # 源语言
    23. sourceLanguage = 'Auto'
    24. headerData = {
    25. 'Cookie': 'OUTFOX_SEARCH_USER_ID=-2022895048@10.168.8.76;',
    26. 'Referer': 'fanyi.youdao.com',
    27. 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
    28. }
    29. # 语言类型缩写
    30. languageTypeSacronym = {
    31. '1': 'zh-CHS 》 en',
    32. '2': 'zh-CHS 》 ru',
    33. '3': 'en 》 zh-CHS',
    34. '4': 'ru 》 zh-CHS',
    35. }
    36. # 翻译类型
    37. translateTypes = [
    38. '中文 》 英语',
    39. '中文 》 俄语',
    40. '英语 》 中文',
    41. '俄语 》 中文'
    42. ]
    43. def startRequest(tanslateWd):
    44. requestURL = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    45. client = 'fanyideskweb'
    46. timeStamp = getTime()
    47. key = 'ebSeFb%=XZ%T[KZ)c(sy!'
    48. sign = getSign(client, tanslateWd, timeStamp, key)
    49. data = { 'i': tanslateWd,
    50. 'from':sourceLanguage,
    51. 'to':targetLanguage,
    52. 'client':client,
    53. 'doctype':'json',
    54. 'version':'2.1',
    55. 'salt':timeStamp,
    56. 'sign':sign,
    57. 'keyfrom':'fanyi.web',
    58. 'action':'FY_BY_REALTIME',
    59. 'typoResult':'true',
    60. 'smartresult':'dict'
    61. }
    62. data = urllib.parse.urlencode(data).encode(encoding="utf-8")
    63. request = urllib.request.Request(requestURL, data=data, headers=headerData)
    64. resonse = urllib.request.urlopen(request)
    65. print(resonse.read().decode("utf-8"))
    66. # 生成时间戳
    67. def getTime():
    68. return str(int(time.time() * 1000) + random.randint(0, 10))
    69. # 生成 Sign
    70. def getSign(client, tanslateWd, time, key):
    71. s = client + tanslateWd + time + key
    72. m = hashlib.md5()
    73. m.update(s.encode('utf-8'))
    74. return m.hexdigest()
    75. def getTranslateType(translateType):
    76. global sourceLanguage, targetLanguage
    77. try:
    78. if translateType:
    79. l = languageTypeSacronym[translateType].split(' 》 ')
    80. sourceLanguage = l[0]
    81. targetLanguage = l[1]
    82. except:
    83. print('翻译类型选择有误,程序将使用 Auto 模式为您翻译')
    84. if __name__ == '__main__':
    85. print('翻译类型:')
    86. for i, data in enumerate(translateTypes):
    87. print('%d: %s' %(i + 1, data))
    88. translateType = input('请选择翻译类型:')
    89. getTranslateType(translateType)
    90. tanslateWd = input('请输入要翻译的消息:')
    91. startRequest(tanslateWd)
  • 相关阅读:
    微博超话签到Js脚本
    OceanBase 如何通过日志观测冻结转储流程?
    Unity坐标转换
    c++ set容器、双指针去重--每日一题
    项目进展(六)-继续学习32位ADC芯片ADS1285
    DiskGenius磁盘分区软件使用教程,磁盘扩容无损备份
    前端工程化精讲第六课 团队工具:如何利用云开发提升团队开发效率?
    677. 键值映射-字符树算法应用
    QT日志类SimpleQtLogger的简单记录
    手把手教你如何自制目标检测框架(从理论到实现)
  • 原文地址:https://blog.csdn.net/u010321564/article/details/126625320