鱼C论坛

 找回密码
 立即注册
查看: 2378|回复: 11

[已解决]求助!爬虫时如何设置层级关系?

[复制链接]
发表于 2020-7-15 07:45:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jjxx2005 于 2020-7-15 08:54 编辑
  1. import requests
  2. from lxml import etree
  3. import re
  4. import os
  5. url = 'http://www.jkl.com.cn/cn/invest.aspx'
  6. UA = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'}
  7. r1 = requests.get(url=url, headers=UA).text
  8. x1 = etree.HTML(r1)
  9. n1 = x1.xpath('//div[@class="infoLis"]//a/text()')
  10. l1 = x1.xpath('//div[@class="infoLis"]//@href')
  11. keys1 = [] ; values1 = []
  12. keys2 = [] ; values2 = []
  13. for n2 in n1:
  14.     n2 = n2.strip()
  15.     keys1.append(n2)
  16. for l2 in l1:
  17.     l2 = 'http://www.jkl.com.cn/cn/' + l2
  18.     values1.append(l2)
  19. d1 = dict(zip(keys1,values1))
  20. for n3,l3 in d1.items( ):
  21.     n3 = n3.replace('/','.')
  22.     path = 'c:/' + n3
  23.     if not os.path.exists(path):
  24.         os.mkdir(path)
  25.     r2 = requests.get(url=l3, headers=UA).text
  26.     x2 = etree.HTML(r2)
  27.     weiye = x2.xpath('//a[text()="尾页"]/@href')
  28.     if weiye != []:
  29.         re1 = re.search("(\d+)'\)", weiye[0])
  30.         yeshu = re1.group(1)
  31.     else:
  32.         yeshu = 1
  33.     for yema in range(1, int(yeshu)+1):
  34.         data = {'__EVENTARGUMENT': yema,
  35.                 '__EVENTTARGET': 'AspNetPager1'
  36.                 }
  37.         r3 = requests.get(url=l3, params=data, headers=UA).text
  38.         x3 = etree.HTML(r3)
  39.         l4 = x3.xpath('//div[@class="newsLis"]//li//@href')
  40.         n4 = x3.xpath('//div[@class="newsLis"]//li/a/text()')
  41.         for n5 in n4:
  42.             n5 = n5.strip()
  43.             keys2.append(n5)
  44.         for l5 in l4:
  45.             l5 = 'http://www.jkl.com.cn' + l5
  46.             values2.append(l5)
  47. d2 = dict(zip(keys2,values2))
  48. print(d1)
  49. print(d2)
复制代码


现在生成了两个字典

我想下载字典2里的pdf文件时,能保存在字典1的key生成的文件夹中   这样的层级关系如何设置?
最佳答案
2020-7-15 10:48:40
jjxx2005 发表于 2020-7-15 10:43
也可能是我代码的逻辑有问题   其实我就是想
左边投资者关系8个项目中所有的页面里面的文件都下载,并修 ...

按网页逻辑来看  左侧 8个大项  应该是一个循环
把这8个标签名提取出来,,建立文件夹   然后扫描每个标签下面的子项目  会得到子标签的名字和链接
下载文件时,文件名是由我们编程人员来随意取名的,这里我们取子标签名即可,分别保存到相对应的路径下
即可,8次循环 over     具体代码我就不写了,,测试时 太耗时间了
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-15 08:50:15 | 显示全部楼层
说一下,你想实现什么样的功能,别说什么字典1字典2的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 08:54:36 | 显示全部楼层
wp231957 发表于 2020-7-15 08:50
说一下,你想实现什么样的功能,别说什么字典1字典2的

您好 我重新上传了图片  我想下载所有文件,然后保存到对应的文件夹中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 09:13:33 | 显示全部楼层
jjxx2005 发表于 2020-7-15 08:54
您好 我重新上传了图片  我想下载所有文件,然后保存到对应的文件夹中

文件太多,我没有全部测试,只测试了几条
D:\wp>py app4.py
c1(AR)-18163914863.pdf 下载成功
c00814-18023226274.pdf 下载成功
c00814AR-19195125508.pdf 下载成功
c00814-16464376689.pdf 下载成功

  1. import requests
  2. from lxml import etree
  3. import re
  4. import os
  5. url = 'http://www.jkl.com.cn/cn/invest.aspx'
  6. UA = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.92 Safari/537.36'}
  7. r1 = requests.get(url=url, headers=UA).text
  8. x1 = etree.HTML(r1)
  9. n1 = x1.xpath('//div[@class="infoLis"]//a/text()')
  10. l1 = x1.xpath('//div[@class="infoLis"]//@href')
  11. keys1 = [] ; values1 = []
  12. keys2 = [] ; values2 = []
  13. for n2 in n1:
  14.     n2 = n2.strip()
  15.     keys1.append(n2)
  16. for l2 in l1:
  17.     l2 = 'http://www.jkl.com.cn/cn/' + l2
  18.     values1.append(l2)
  19. d1 = dict(zip(keys1,values1))
  20. for n3,l3 in d1.items( ):
  21.     n3 = n3.replace('/','.')
  22.     path = 'c:/' + n3
  23.     if not os.path.exists(path):
  24.         os.mkdir(path)
  25.     r2 = requests.get(url=l3, headers=UA).text
  26.     x2 = etree.HTML(r2)
  27.     weiye = x2.xpath('//a[text()="尾页"]/@href')
  28.     if weiye != []:
  29.         re1 = re.search("(\d+)'\)", weiye[0])
  30.         yeshu = re1.group(1)
  31.     else:
  32.         yeshu = 1
  33.     for yema in range(1, int(yeshu)+1):
  34.         data = {'__EVENTARGUMENT': yema,
  35.                 '__EVENTTARGET': 'AspNetPager1'
  36.                 }
  37.         r3 = requests.get(url=l3, params=data, headers=UA).text
  38.         x3 = etree.HTML(r3)
  39.         l4 = x3.xpath('//div[@class="newsLis"]//li//@href')
  40.         n4 = x3.xpath('//div[@class="newsLis"]//li/a/text()')
  41.         for n5 in n4:
  42.             n5 = n5.strip()
  43.             keys2.append(n5)
  44.         for l5 in l4:
  45.             l5 = 'http://www.jkl.com.cn' + l5
  46.             values2.append(l5)
  47. d2 = dict(zip(keys2,values2))
  48. #print(d1)
  49. for x in d2:
  50.    if not os.path.exists(x):
  51.         os.makedirs(x)
  52. for x in d2:  
  53.     pdfurl=d2[x]
  54.     pdfdata=requests.get(pdfurl).content      
  55.     with open(d2[x].split("/")[-1],"wb") as f:
  56.          f.write(pdfdata)
  57.     print(d2[x].split("/")[-1],"下载成功")     
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 09:19:24 | 显示全部楼层
请修改4楼关键代码,忘分配目录了

with open(x+"\\"+d2[x].split("/")[-1],"wb") as f:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 10:14:03 | 显示全部楼层
wp231957 发表于 2020-7-15 09:19
请修改4楼关键代码,忘分配目录了

with open(x+"\\"+d2[x].split("/")[-1],"wb") as f:

您好感谢您的回复,我绕着的地方可能是我没表达清楚,您写的都对,只是我想让每个文件属于他自己的文件名,而不是网址上那个数字文件名。
原来  
字典1={项目名:项目链接}
我用项目名做文件夹的名称,项目链接去获取解析
字典2 = {文件名:文件下载链接}
文件下载时,我让他使用网页上显示的名称
以上单步做我都会

但是现在的问题是,文件下载时,使用网页上显示的中文名,然后放在对应的文件夹中 我找不到两个字典

文件下载链接和项目名 之间的对应关系
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 10:19:47 | 显示全部楼层
wp231957 发表于 2020-7-15 09:19
请修改4楼关键代码,忘分配目录了

with open(x+"\\"+d2[x].split("/")[-1],"wb") as f:

能不能通过 这样的方式实现?
>>> dict={}
>>> dict.setdefault("a",{}).update({"A":"T"})
>>>
>>> dict
{'a': {'A': 'T'}}
>>> dict["a"]['A']
'T'
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 10:21:59 From FishC Mobile | 显示全部楼层
jjxx2005 发表于 2020-7-15 10:19
能不能通过 这样的方式实现?
>>> dict={}
>>> dict.setdefault("a",{}).update({"A":"T"})

文件名和文件夹名相同吗????
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 10:41:28 | 显示全部楼层
wp231957 发表于 2020-7-15 10:21
文件名和文件夹名相同吗????

让左边那一列做文件夹的名

网页上的大圈文字都是文件名
2.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 10:43:05 | 显示全部楼层
wp231957 发表于 2020-7-15 10:21
文件名和文件夹名相同吗????

也可能是我代码的逻辑有问题   其实我就是想
左边投资者关系8个项目中所有的页面里面的文件都下载,并修改成蓝色大圈的文字,然后分别保存到左边对应的项目名称的文件夹中
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-15 10:48:40 | 显示全部楼层    本楼为最佳答案   
jjxx2005 发表于 2020-7-15 10:43
也可能是我代码的逻辑有问题   其实我就是想
左边投资者关系8个项目中所有的页面里面的文件都下载,并修 ...

按网页逻辑来看  左侧 8个大项  应该是一个循环
把这8个标签名提取出来,,建立文件夹   然后扫描每个标签下面的子项目  会得到子标签的名字和链接
下载文件时,文件名是由我们编程人员来随意取名的,这里我们取子标签名即可,分别保存到相对应的路径下
即可,8次循环 over     具体代码我就不写了,,测试时 太耗时间了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-15 10:50:20 | 显示全部楼层
wp231957 发表于 2020-7-15 10:48
按网页逻辑来看  左侧 8个大项  应该是一个循环
把这8个标签名提取出来,,建立文件夹   然后扫描每个标 ...

好的 我试一下 谢谢您 给的思路
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-1 14:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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