鱼C论坛

 找回密码
 立即注册
查看: 2353|回复: 0

[技术交流] 网络爬虫案例

[复制链接]
发表于 2020-3-13 15:52:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
必要的easygui 和 requests_html 模块pip install 就行,效果图贴出来了
下面就开始我们的学习(XXOO)吧 ,代码如下:
  1. import urllib.robotparser
  2. from requests_html import HTMLSession
  3. import os
  4. import urllib.request
  5. import easygui as g

  6. #目标网站
  7. url = "https://www.lnlnl.cn/meitu/"

  8. #对文件名进行处理
  9. def dir_name_process(name):
  10.     dir_name = ''
  11.     for i in name:
  12.         if i  not in "|\\/*:"<>":
  13.             dir_name += i
  14.     return dir_name
  15.          
  16. #生成session对象
  17. def session_generate(url):
  18.     session = HTMLSession()
  19.     html = session.get(url)
  20.     return html

  21. #判断目标网站是否允许爬取
  22. def judge(url, link):
  23.     rq = urllib.robotparser.RobotFileParser()
  24.     rq.set_url(url + '/robot.txt')
  25.     rq.read()
  26.     info = rq.can_fetch('*', link)
  27.     return info

  28. #选择自己喜欢的类型
  29. def choose_item(url):
  30.     r = session_generate(url)
  31.     r = r.html.find("#main > div > div > div > div.title > span > a:nth-child(n)")
  32.     name_links = [i.text for i in r]
  33.     name_link = g.choicebox(msg = "选择你喜欢的类型,嘿嘿",choices = name_links)
  34.     count = 0;
  35.     for i in r :
  36.         if i.text == name_link:
  37.             return i.attrs['href']

  38. #判断是否可以爬取,并选择要下载的页数
  39. def page_fetch(url, link):
  40.     if not judge(url, link) :#查看Robot协议
  41.         g.msgbox( msg = "哎呀,站长不让你获取图")
  42.         return False
  43.     else :
  44.         g.msgbox(msg = "恭喜,站长:小子,可以取我的图", title = '询问站长是否可以爬取')

  45.     h = session_generate(link)
  46.     links = h.html.xpath('//*[@id="main"]/div/div/div/div/a/@href')
  47.     links =  sorted((list(set(links))))
  48.     links.insert(0, link)
  49.     page = g.multchoicebox(msg ="共有%d页的内容,请选择您想要的页数(从0页开始<( ̄3 ̄)>哼!)"%len(links), choices = range(len(links)))
  50.     if page == []:
  51.         yield None
  52.     for link in page:
  53.         link = int(link)
  54.         print("正在下载%d页" %link)
  55.         yield links[link]

  56. #在网页中选择想要的主题图片
  57. def page_download(link):
  58.     h = session_generate(link)
  59.     links = h.html.xpath('//*[@id="main"]/div/div/div/ul/li/div/a')
  60.     name_links = [ link.xpath("//img/@alt")[0]  for link in links ]
  61.     name_links = g.multchoicebox( msg = "共有%d个主题,选择一下吧ヾ(&#10048;&#9593;&#9697;&#9593;)&#65417;~"%(len(links))  ,choices = name_links)
  62.     if name_links == None:
  63.         return None
  64.     for link in links:
  65.         name = link.xpath("//img/@alt")[0]
  66.         if name in name_links:
  67.             print("正在下载的主题:%s" %(name))
  68.             link = link.xpath("//@href")
  69.             yield (name, link[0])

  70. #下载所选主题的图片
  71. def get_picture_links(link):
  72.     link = session_generate(link)
  73.     links = link.html.xpath('//*[@id="main"]/div/div[1]/div[1]/div[2]/p/img/@src')
  74.     for link in links:
  75.         try:
  76.             req = urllib.request.Request(link)
  77.             req.add_header('User-Agent', "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Mobile Safari/537.36")
  78.             response = urllib.request.urlopen(req).read()
  79.             name = link.split('/')[-1]
  80.             if ".jpg" not in name or ".png" not in name :
  81.                 name += ".jpg"
  82.             f = open(name, 'wb')
  83.             f.write(response)
  84.             f.close()
  85.         except :
  86.             print("一张图下载失败(||&#3664;_&#3664;) 地址:", link)
  87.     print("当前主题下载完成!ヾ(&#10048;&#9593;&#9697;&#9593;)&#65417;~")

  88. #主程序
  89. if __name__ == "__main__":
  90.     choice = g.ccbox(msg = "你是否已满18岁?", title = "FBI Warning", choices = ["别多BB快点开车!", "我还差一丢丢"])
  91.     if choice == True:  #下载过程
  92.         g.msgbox(msg = "每个主题中图片都不少,别下的太多", title = "上车前的安全提示")
  93.         dir_path = g.diropenbox(msg = "选择你想要保存XXOO的位置")
  94.         dir_path = dir_path + "/XXOO"
  95.         os.mkdir(dir_path)
  96.         os.chdir(dir_path)
  97.         link = choose_item(url)
  98.         for fetch_link in page_fetch(url, link):
  99.             for data in page_download(fetch_link):
  100.                 if data == None :
  101.                     break
  102.                 name, download_link = data
  103.                 os.chdir(dir_path)
  104.                 name = dir_name_process(name)
  105.                 os.mkdir(name)
  106.                 os.chdir(name)
  107.                 get_picture_links(download_link)
  108.         print("下载任务结束(* ̄3 ̄)╭&#9825;&#10048;小花花砸你")
  109.     else :
  110.         g.msgbox(msg = "这不是去幼儿园的车欧,快点换车", title = "温馨提示")
复制代码

如果有疑问或改进的方法,欢迎跟帖,不胜感激(这次去除了一些话,应该能过审核吧)
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-14 22:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表