鱼C论坛

 找回密码
 立即注册
查看: 1969|回复: 9

[已解决]爬虫问题

[复制链接]
发表于 2023-7-24 13:11:13 | 显示全部楼层 |阅读模式

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

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

x
具体代码不再往上贴了,我写了一个程序用来获取指定网址下所有的pdf文件。
我的思路:1,先用requests获取源码 2,用re匹配pdf文件地址
这时我发现,网站源码 a 标签 内的pdf文件网址是不完全的,就像下面这样
<a href="/module/download/downfile.jsp?classid=0&showname=%E5%B1%B1%E4%B8%9C%E7%9C%81%E5%AE%9E%E9%AA%8C%E4%B8%AD%E5%AD%A6%E7%AC%AC%E4%BA%8C%E6%89%B9%E6%AC%A1%E5%BD%95%E5%8F%96%E5%90%8D%E5%8D%95.pdf&filename=34244c4ad6bd4bfe8da14618b22debb7.pdf"><img style="border:none;" src="/module/jslib/icons/acrobat.png">11111.pdf</a>
因为html这方面我研究很少,我以为我只需要在前面加上主域名即可(我措辞可能不太准确)。其实这样可以解决大部分问题,但偶尔加上主域名也是无效文件,这样该如何是好?

加上主域名后的文件地址
http://sdshiyan.jinan.cn//module/download/downfile.jsp?classid=0&showname=%E5%B


这件事我说的很复杂,其实就是我网页知识欠缺,往指教!
最佳答案
2023-7-24 13:11:34
你写的爬虫程序获取PDF文件的思路基本是正确的。将网页源码通过requests库获取,然后使用正则表达式匹配出PDF文件的地址。但是你提到有些PDF文件的网址在前面加上主域名后仍然无效,你想知道如何解决这个问题。

根据你提供的网页源码示例,发现PDF文件的网址是相对路径,需要将其转换为完整的URL才能正确下载。可以通过以下步骤来实现:

1. 获取主域名:从指定的网址中提取主域名部分,例如http://sdshiyan.jinan.cn/

2. 拼接URL:对于每个PDF文件的相对路径,判断它是否以http开头。如果不是,则将其与主域名拼接起来,得到完整的URL。

下面是一个示例代码,展示了如何实现上述逻辑:
import re
import requests
from urllib.parse import urljoin

def get_pdf_urls(url):
    response = requests.get(url)
    html_content = response.text

    domain = "http://sdshiyan.jinan.cn/"  # 你需要设置主域名,根据实际情况修改

    pdf_urls = []
    pattern = r'<a\s.*?href="(.*?\.pdf)"'
    matches = re.findall(pattern, html_content)
    for match in matches:
        absolute_url = urljoin(domain, match)
        pdf_urls.append(absolute_url)

    return pdf_urls

# 指定网址进行测试
url = "http://sdshiyan.jinan.cn/"
pdf_urls = get_pdf_urls(url)
print(pdf_urls)

在上面的代码中,我使用了urljoin()函数来拼接URL。它会根据基础URL和相对路径自动处理URL的拼接工作,无需手动处理斜杠(/)。

希望这个解决方案对你有所帮助!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案

评分

参与人数 1鱼币 +1 收起 理由
学习编程中的Ben + 1 送鱼币,求最佳

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-24 13:11:34 | 显示全部楼层    本楼为最佳答案   
你写的爬虫程序获取PDF文件的思路基本是正确的。将网页源码通过requests库获取,然后使用正则表达式匹配出PDF文件的地址。但是你提到有些PDF文件的网址在前面加上主域名后仍然无效,你想知道如何解决这个问题。

根据你提供的网页源码示例,发现PDF文件的网址是相对路径,需要将其转换为完整的URL才能正确下载。可以通过以下步骤来实现:

1. 获取主域名:从指定的网址中提取主域名部分,例如http://sdshiyan.jinan.cn/

2. 拼接URL:对于每个PDF文件的相对路径,判断它是否以http开头。如果不是,则将其与主域名拼接起来,得到完整的URL。

下面是一个示例代码,展示了如何实现上述逻辑:
import re
import requests
from urllib.parse import urljoin

def get_pdf_urls(url):
    response = requests.get(url)
    html_content = response.text

    domain = "http://sdshiyan.jinan.cn/"  # 你需要设置主域名,根据实际情况修改

    pdf_urls = []
    pattern = r'<a\s.*?href="(.*?\.pdf)"'
    matches = re.findall(pattern, html_content)
    for match in matches:
        absolute_url = urljoin(domain, match)
        pdf_urls.append(absolute_url)

    return pdf_urls

# 指定网址进行测试
url = "http://sdshiyan.jinan.cn/"
pdf_urls = get_pdf_urls(url)
print(pdf_urls)

在上面的代码中,我使用了urljoin()函数来拼接URL。它会根据基础URL和相对路径自动处理URL的拼接工作,无需手动处理斜杠(/)。

希望这个解决方案对你有所帮助!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:11:48 | 显示全部楼层
首先,你的思路基本是对的。从你的描述来看,问题在于你抓取的部分URL并不是完全的URL,可能需要拼接才能得到正确的PDF文件地址。

首先,你需要确保的是,这个相对路径(/module/download/downfile.jsp?classid=0&showname=xxx.pdf&filename=xxx.pdf)是否是相对于当前页面的路径,还是相对于网站根目录的路径。

· 如果它是相对于当前页面的路径,你需要将当前页面的URL(不包括最后的文件名或/)和这个相对路径拼接在一起。
· 如果它是相对于网站根目录的路径,你需要将网站的根URL和这个相对路径拼接在一起。

下面是一个Python的例子,我假设你正在使用的语言是Python,并且你的相对路径是相对于网站根目录的:
from urllib.parse import urljoin

# 你的主域名
base_url = 'http://sdshiyan.jinan.cn'

# 你的相对路径
relative_url = "/module/download/downfile.jsp?classid=0&showname=%E5%B1%B1%E4%B8%9C%E7%9C%81%E5%AE%9E%E9%AA%8C%E4%B8%AD%E5%AD%A6%E7%AC%AC%E4%BA%8C%E6%89%B9%E6%AC%A1%E5%BD%95%E5%8F%96%E5%90%8D%E5%8D%95.pdf&filename=34244c4ad6bd4bfe8da14618b22debb7.pdf"

# 使用urljoin进行拼接
full_url = urljoin(base_url, relative_url)

print(full_url)
这个 urljoin 函数会帮你正确地将主域名和相对路径拼接在一起。

然后,使用这个完整的URL来获取PDF文件。注意,即使URL看起来正确,文件也可能因为其他原因(比如服务器错误,文件已经被移除等)无法获取。在这种情况下,你可能需要处理这些错误情况,比如使用try-except来捕获可能的异常。

如果即使使用了这种方法,仍然存在获取不到PDF文件的情况,可能需要更详细地研究一下这个网站的结构,看看是否存在其他的规则需要遵守。在某些情况下,PDF文件的URL可能被存储在其他地方,比如JavaScript代码中,或者需要进行一些额外的请求才能获取。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:16:08 | 显示全部楼层
不一定是主域名啊,这个是相对路径引用,你可以看网站的url

大部分网站在 base 元素里都有写
Snipaste_2023-07-24_13-15-34.png

点评

我看了,这个暂时不会影响得到  发表于 2023-7-24 13:24
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:18:34 | 显示全部楼层
判断是否有效即可

评分

参与人数 1鱼币 +2 收起 理由
青出于蓝 + 2 抱歉。。。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-24 13:28:34 | 显示全部楼层
艹,我是小丑,是我的re匹配有局限性,不好意思,添麻烦了

点评

bs4  发表于 2023-7-24 13:31

评分

参与人数 1荣誉 +1 收起 理由
学习编程中的Ben + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:29:53 | 显示全部楼层
我看了,这个暂时不会影响得到


如果目录一致的话,你的做法是对的
url = response.url
prefix = "".join(url.split("/")[:3]) + "/"
pdf_url = prefix + pdf["href"]
content = requests.get(pdf_url)
with open("pdf.pdf", "wb") as f:
    f.write(content)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-24 13:30:28 | 显示全部楼层
QAQ
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 08:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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