爬虫问题
具体代码不再往上贴了,我写了一个程序用来获取指定网址下所有的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
这件事我说的很复杂,其实就是我网页知识欠缺,往指教! 你写的爬虫程序获取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的拼接工作,无需手动处理斜杠(/)。
希望这个解决方案对你有所帮助!如果还有其他问题,请随时提问。
如果问题已经解决,请设置最佳答案 首先,你的思路基本是对的。从你的描述来看,问题在于你抓取的部分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代码中,或者需要进行一些额外的请求才能获取。 不一定是主域名啊,这个是相对路径引用,你可以看网站的url
大部分网站在 base 元素里都有写
判断是否有效即可 艹,我是小丑,是我的re匹配有局限性,不好意思,添麻烦了 我看了,这个暂时不会影响得到
如果目录一致的话,你的做法是对的
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)
QAQ
页:
[1]