python爬虫三:获取一个网易用户的所有图片(selenium+phantomjs)

举报
用户已注销 发表于 2021/11/19 05:52:18 2021/11/19
2k+ 0 0
【摘要】 在  python爬虫二:网易博客的图片  中的代码只需要一篇博客的url就可以把图片全部下载下来 如果想把一个网易博客用户的所有图片都下载下来,只需要利用搜索算法把他的所有博客url都找到即可。 对于网易博客来说,这一工作的难点在于,任何一篇博客的html代码中是不包含其他博客的url的,也就是说博客里面的互链...

在  python爬虫二:网易博客的图片  中的代码只需要一篇博客的url就可以把图片全部下载下来

如果想把一个网易博客用户的所有图片都下载下来,只需要利用搜索算法把他的所有博客url都找到即可。

对于网易博客来说,这一工作的难点在于,任何一篇博客的html代码中是不包含其他博客的url的,也就是说博客里面的互链是动态链接。为了解决这个问题,我们需要selenium和phantomjs,利用无头浏览器模拟用户点击,从而抓取url

代码:


      #coding=utf-8
      import re
      import urllib.request
      import os
      from selenium import webdriver #########需要先安装selenium
      user = 'jason0320' #########用户名
      theurl = 'http://' + user + '.blog.163.com/blog'
      thepath = 'D:\\wa' #########选择一个路径,确保其中存在url_path.txt
      url_path = thepath + '\\' + 'url_path.txt' #存储该用户所有页面链接
      phantomjs_path = "C:\phantomjs.exe" #########需要先下载phantomjs.exe
      coding = 'gbk'#########这个要去网页源代码里面查
      def get_all_url(): #获取该用户所有页面链接
          already = []
          all_url = ['http://jason0320.blog.163.com/blog/static/2703529720161017111442198']
          fp = open(url_path,'r')
          lines = fp.readlines()
         for line in lines:
              line = line.strip('\n')
             if line == '':
       continue
       already.append(line)
       all_url.append(line)
       fp.close()
       driver = webdriver.PhantomJS(executable_path=phantomjs_path,service_args=['--load-images=no']) #不加载图片,加快速度
          i=0
          fp = open(url_path,'w')
          already = list(set(already))
         for each in already:
              fp.write(each+'\n')
         while(i<len(all_url)):
              url = all_url[i]
              i=i+1
             try:
                  driver.get(url)
              except:
                 print('连接失败')
                 print(url)
                 continue
              html = driver.page_source
              url_list = re.findall('.blog.163.com/blog/static/[0-9]*',html)
             for each in url_list:
                  u = 'http://' + user + each
                 if u not in all_url:
                      all_url.append(u)     #广度优先搜索
                 if u not in already:
                      fp.write(u+'\n')
                      already.append(u)
             print(i)
          fp.close()
      if __name__=='__main__':
         get_all_url()
  
 

原理上,这个代码是可以获取所有url的,不过实际上这个程序受限于网络,网络不好的话会中断,所以实际上我只获取了jason0320的352个url

所有链接:

http://jason0320.blog.163.com/blog/static/2703529720166131113704
http://jason0320.blog.163.com/blog/static/27035297201478111818113
http://jason0320.blog.163.com/blog/static/27035297201508115710851
。。。。。。
http://jason0320.blog.163.com/blog/static/27035297201506105935484
http://jason0320.blog.163.com/blog/static/270352972015096472786

其中大部分被省略掉了,完整的后缀列表如下:


文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/77074899

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。