html怎么用五个div做正方形_用python实现从豆瓣网上爬取王祖贤的照片

准备工作

安装好python、chromedriver、浏览器的XPath Helper插件 python学习:http://www.runoob.com/python3/python3-tutorial.htmlXPath语法学习:http://www.w3school.com.cn/xpath/xpath_syntax.asp

实战

这次爬取的数据分别为json格式和HTML格式

json格式

json格式在http://www.douban.com网站中,搜索王祖贤,通过开发者模式可以找到请求的地址 https://www.douban.com/j/search_photo?q=%E7%8E%8B%E7%A5%96%E8%B4%A4&limit=20&start=0,如下图所示:

2a7730b109ab869c575e9ad2b1ce9816.png

然后我们访问这个url,可以看到返回了json的数据:

9e4de8b4b073288f4b30ac4cd7af062d.png

解析代码示例

  1. # 数据是json格式
  2. def getPhotos():
  3. ''' for 循环 请求全部的 url '''
  4. for i in range(0, 200, 20):
  5. url = 'https://www.douban.com/j/search_photo?q=' + query + '&limit=20&start=' + str(i)
  6. html = requests.get(url).text # 得到返回结果
  7. response = json.loads(html, encoding='utf-8') # 将 JSON 格式转换成 Python 对象
  8. for image in response['images']:
  9. print(image['src']) # 查看当前下载的图片网址
  10. download(image['src'], image['id']) # 下载一张图片

HTML格式

HTML格式的访问https://movie.douban.com,搜索 王祖贤,通过查看源码,了解结构,然后用XPath Helper插件做试验,按住ctrl+shift+x 同时鼠标点击王祖贤图片,根据XPath的语法同时根据HTML的结构写解析表达式: //div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']

XPath语法学习: http://www. w3school.com.cn/xpath/x path_syntax.asp

95d430a0a5bfcecad5a7177ba3b2b627.png

解析代码示例

  1. # 数据是 html格式,有时候网页会用 JS请求数据,只有等JS都加载结束后,才能获取完成的html,但xpath不受限制
  2. def getMoviePhotos():
  3. url = 'https://movie.douban.com/subject_search?search_text=' + query + '&cat=1002'
  4. driver = webdriver.Chrome(chromedriverPath)
  5. driver.get(url)
  6. # 初始化
  7. html = etree.HTML(driver.page_source)
  8. # 使用xpath helper, ctrl+shit+x 选中元素
  9. # xpath 语法 http://www.w3school.com.cn/xpath/xpath_syntax.asp
  10. src_xpath = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src"
  11. title_xpath = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']"
  12. srcs = html.xpath(src_xpath)
  13. titles = html.xpath(title_xpath)
  14. # zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,返回由元组组成的对象。优点是节约内存
  15. # 参考 http://www.runoob.com/python3/python3-func-zip.html
  16. for src, title in zip(srcs, titles):
  17. # join 字符串拼接
  18. print('t'.join([str(src), str(title.text)]))
  19. download(src, title.text)
  20. driver.close()

完整代码

  1. import requests
  2. import json
  3. # lxml是一个流行的解析库,使用的是Xpath语法,可以解析HTML
  4. from lxml import etree
  5. from selenium import webdriver
  6. query = '王祖贤'
  7. downloadPath = 'D:/workspace/study/python/text_classification/testdata/photos/'
  8. # chromedriver需要配置环境变量,查看网上资料说建议放到python的Scripts目录下
  9. chromedriverPath = 'D:/devsoft/python/Scripts/chromedriver'
  10. ''' 下载图片 '''
  11. def download(src, id):
  12. dir = downloadPath + str(id) + '.jpg'
  13. try:
  14. pic = requests.get(src, timeout=10)
  15. fp = open(dir, 'wb')
  16. fp.write(pic.content)
  17. fp.close()
  18. except requests.exceptions.ConnectionError:
  19. print('图片无法下载')
  20. # 数据是json格式
  21. def getPhotos():
  22. ''' for 循环 请求全部的 url '''
  23. for i in range(0, 200, 20):
  24. url = 'https://www.douban.com/j/search_photo?q=' + query + '&limit=20&start=' + str(i)
  25. html = requests.get(url).text # 得到返回结果
  26. response = json.loads(html, encoding='utf-8') # 将 JSON 格式转换成 Python 对象
  27. for image in response['images']:
  28. print(image['src']) # 查看当前下载的图片网址
  29. download(image['src'], image['id']) # 下载一张图片
  30. # 数据是 html格式,有时候网页会用 JS请求数据,只有等JS都加载结束后,才能获取完成的html,但xpath不受限制
  31. def getMoviePhotos():
  32. url = 'https://movie.douban.com/subject_search?search_text=' + query + '&cat=1002'
  33. driver = webdriver.Chrome(chromedriverPath)
  34. driver.get(url)
  35. # 初始化
  36. html = etree.HTML(driver.page_source)
  37. # 使用xpath helper, ctrl+shit+x 选中元素
  38. # xpath 语法 http://www.w3school.com.cn/xpath/xpath_syntax.asp
  39. src_xpath = "//div[@class='item-root']/a[@class='cover-link']/img[@class='cover']/@src"
  40. title_xpath = "//div[@class='item-root']/div[@class='detail']/div[@class='title']/a[@class='title-text']"
  41. srcs = html.xpath(src_xpath)
  42. titles = html.xpath(title_xpath)
  43. # zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,返回由元组组成的对象。优点是节约内存
  44. # 参考 http://www.runoob.com/python3/python3-func-zip.html
  45. for src, title in zip(srcs, titles):
  46. # join 字符串拼接
  47. print('t'.join([str(src), str(title.text)]))
  48. download(src, title.text)
  49. driver.close()
  50. getPhotos()
  51. getMoviePhotos()

成果

8a8f2ca26664cf253998d13581e04d69.png

总结

用python实现爬虫一直是我想学习的,但却迟迟没有行动,趁着放假,跟着数据分析的专栏做了几个实战的练习,很高兴最后成功了,思路和代码参考了老师的例子和大家的评论,因为我是python零基础,所以通过实战也顺便学了python。整个过程下来的感悟是,还是实战学东西快,以后更要多多实操,而不仅仅看理论。小小的实战成功能激发自己学习的动力,希望大家也能亲自尝试下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值