• mac下 如何简单粗暴 使用Python进行网络爬虫(2)


    这次 我们来爬一个图片网站 然后保存到数据库
    目标 我们选择 http://www.win4000.com/zt/fengjing.html
    先打开网站看一下

    我们的目的 就是抓风景桌面的壁纸 但这些都是缩略图 大图 在点击后的详情页里面
    我们再次点击 一张素略图 看看

    基本上 每一个缩略图都对应8-9张大图
    那么 我们的目的很明确了 根据每个缩略图 找到对应的大图 并且下载下来

    回到 http://www.win4000.com/zt/fengjing.html 检查元素查看网页 源代码

    这个简直太简单了 直接用 BeautifulSoup获得每一个缩略图对应的详情

    再来查看对应大图的

    既然每张大图 大概有8-9张不等 那我们就搞一个循环直接便利

    得到图片url后 开始下载

    (注 我这里把下载扔到桌面 你也可以根据自己的需求更换地址)
    到这一步 我们算是把图片抓取过来了。

    继续扩展一下 既然捕捉到了图片 那么我们能不能存到数据库里?
    当然可以! 看如下操作

    首先 数据库软件 我使用

    mac系统下 有破解版的 破解过程很简单 我就不重复了
    打开软件
    在127.0.0.1点击右键->新建数据库

    id自增 title url 一共三个字段

    我是根据 标题 来判断 当前的图片 是否下载成功
    如果数据库 没有 才可以从网络上下载
    downPic(img)这个方法 就是上面下载的函数方法

    完整代码

    1. import requests
    2. from bs4 import BeautifulSoup
    3. import html5lib
    4. import time
    5. import pymysql
    6. import random
    7. import urllib
    8. #抓取网页数据
    9. def getRequestHtml():
    10. response = requests.get('http://www.win4000.com/zt/fengjing.html')
    11. soup = BeautifulSoup(response.content,'html5lib')
    12. content = soup.find('div', class_='tab_box')
    13. li_list = content.findAll('li')
    14. #找到所有 li 标签内容
    15. for li in li_list:
    16. url = li.find('a')['href']
    17. getPicDetail(url)
    18. def getPicDetail(url):
    19. for i in range(1, 10):
    20. splitUrl = url.replace('.html','_%s.html'%i)
    21. print('拼接url :%s'%splitUrl)
    22. response = requests.get(splitUrl)
    23. soup = BeautifulSoup(response.content, 'html5lib')
    24. soupArticle = soup.find('div', class_='pic-meinv')
    25. #判断当前对象 是不是为空
    26. if soupArticle:
    27. # print(soupArticle)
    28. soupImg = soupArticle.find('img')
    29. # print(soupImg)
    30. title = soupImg['title'] # 得到标题
    31. splitTitle = '%s%s' % (title, i)
    32. img = soupImg['src'] # 得到图片
    33. # 根据数据库里面数据来判断 该图片是否下载
    34. insert_table(img, splitTitle)
    35. time.sleep(2) # 休眠2
    36. else:
    37. print('当前链接为空')
    38. return
    39. #把爬虫数据 插入到数据库
    40. def insert_table(img, splitTitle):
    41. # 建立连接
    42. db = pymysql.connect(host='localhost',
    43. user='root',
    44. password='123',
    45. db='pictureData',
    46. charset="utf8")
    47. # 插入数据
    48. query_sql = 'select * from picture where title=%s'
    49. sql = 'insert into picture (title,url) values (%s, %s)'
    50. # 使用 cursor() 方法创建一个游标对象 cursor
    51. cursor = db.cursor()
    52. try:
    53. query_value = (splitTitle)
    54. #执行sql语句 判断 是否已经有了
    55. cursor.execute(query_sql,query_value)
    56. results = cursor.fetchall()
    57. if len(results) == 0:
    58. value = (splitTitle, img)
    59. cursor.execute(sql,value)
    60. #提交事务
    61. db.commit()
    62. print('---------《%s》已经插入成功-----'%splitTitle)
    63. downPic(img)
    64. return True
    65. else:
    66. print('--------------《%s》 已经存在-------------' % splitTitle)
    67. return False
    68. except BaseException as e: # 如果发生错误则回滚
    69. db.rollback()
    70. print('插入数据时产生了错误')
    71. print(e)
    72. finally: # 关闭游标连接
    73. cursor.close()
    74. # 关闭数据库连接
    75. db.close()
    76. def downPic(url):
    77. print('开始下载图片:%s'%url)
    78. message = None
    79. createNum = createRandom() #给每个下载图片 赋值成不同的名字
    80. file = open('/Users/sike/Desktop/scenery/%s.jpg' % createNum, 'wb')
    81. try:
    82. getImg = urllib.request.urlopen(url)
    83. file.write(getImg.read())
    84. print('下载完成')
    85. except Exception as e:
    86. #捕捉异常
    87. message = str(e)
    88. print(message)
    89. finally:
    90. file.closed
    91. print('关闭文件系统')
    92. print('\n')
    93. #生成20个随机字符
    94. def createRandom():
    95. chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
    96. picName = ''
    97. length = len(chars) - 1
    98. for i in range(20):
    99. picName += chars[random.randint(0, length)]
    100. return picName
    101. if __name__ == '__main__':
    102. getRequestHtml()

    参考资料
    Python 爬虫实战(一):使用 requests 和 BeautifulSoup - SegmentFault 思否
    Python 爬虫实战(二):使用 requests-html - SegmentFault 思否

  • 相关阅读:
    浅谈顺序表基本操作
    深度学习常见激活函数:ReLU,sigmoid,Tanh,softmax,Leaky ReLU,PReLU,ELU,Maxout整理集合,场景应用
    git创建
    android事件分发机制详解
    玩转Mysql系列 - 第14篇:详解事务
    Dubbo中的Triple协议和应用级服务发现
    【C++】构造函数意义 ( 构造函数显式调用与隐式调用 | 构造函数替代方案 - 初始化函数 | 初始化函数缺陷 | 默认构造函数 )
    GAIN的代码实现(4)——基于GAN的Spam数据集缺失数据填补(序)【改进版】
    全网最硬核 JVM TLAB 分析 3. JVM EMA期望算法与TLAB相关JVM启动参数
    Linux使用Docker完整安装Superset3,同时解决please use superset_config.py to override it报错
  • 原文地址:https://blog.csdn.net/sike2008/article/details/126675460