C# 网页中的内部链接转换为可以爬取的链接

paniclp 2019-08-14 09:31:38
比如这个网站
http://www.sscopper.com/Website/index.asp
有个联系我们的链接
然后,我爬取该链接,他是个内部链接,<a href="cWeb.asp?id=3"><em>联系我们</em></a>

链接取出来就是这样的
cWeb.asp?id=3,这样的链接没办法下载网页
应该怎么处理,才能变成可以下载的链接。


我希望是一个通用的做法

public static string GetPageSource(string URL)
{
Uri uri = new Uri(URL);

HttpWebRequest hwReq = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse hwRes = (HttpWebResponse)hwReq.GetResponse();

hwReq.Method = "Get";

hwReq.KeepAlive = false;

StreamReader reader = new StreamReader(hwRes.GetResponseStream(), System.Text.Encoding.GetEncoding("GB2312"));



return reader.ReadToEnd();
}
...全文
2448 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
CMDD2609356 2019-08-19
  • 打赏
  • 举报
回复
楼主举一个不是当前url+cWeb.asp?id=3的实际例子看看
  • 打赏
  • 举报
回复
今天意外发现了这里,学习了
xiaoxiangqing 2019-08-16
  • 打赏
  • 举报
回复
前面的网址需要补全
货郎大叔 2019-08-15
  • 打赏
  • 举报
回复
获取 hwReq 中可以找到host ,segment等信息, 一般来说网址就是host+内部链接
Dennis Cheung 2019-08-15
  • 打赏
  • 举报
回复
把前面的http://www.sscopper.com/Website补全就行了
闭包客 2019-08-15
  • 打赏
  • 举报
回复
相对地址的问题。 .NET 的 Uri 类有对应的处理方法。
楠小南 2019-08-14
  • 打赏
  • 举报
回复
为什么会知道链接?html 都是靠浏览器翻译的,你说他知不知道
paniclp 2019-08-14
  • 打赏
  • 举报
回复
另外为啥浏览器能知道链接呢,源代码明明是内部链接,浏览器能分辨,你点击链接,会直接打开正确的
paniclp 2019-08-14
  • 打赏
  • 举报
回复
我的思路是获取
hwReq 中可以找到host ,segment等信息,
一般来说网址就是host+内部链接

但是刚才我发的那个就比较特别,需要http://www.sscopper.com/Website+内部链接


有什么好的方法来做么?
XBodhi. 2019-08-14
  • 打赏
  • 举报
回复
首先企业的网址不一样,你可以一直爬 同步来分析是否是企业网站,基本上头部都包含XXXX有限公司或是其他类型的公司。所以你可以在确定是否是主页,然后再找关键字。然后再进入内页最后分析。不过这个要很耗时间的。你一天也爬不了多少。因为你不知道企业的地址,
  • 打赏
  • 举报
回复
你都说每个网站都不一样,怎么可能做到通用。 如果你说类似于你现在这个网站的话,倒可以保留你输入的要爬的地址,靠截取补全呗
paniclp 2019-08-14
  • 打赏
  • 举报
回复
我确实能想到这种结果,只是你代码怎么去写,我希望是通用的做法,
每个网站都不一样的情况
  • 打赏
  • 举报
回复
把前面的http://www.sscopper.com/Website补全就行了 http://www.sscopper.com/Website/cWeb.asp?id=3你看看
文盲老顾 2019-08-14
  • 打赏
  • 举报
回复
第一步,获取当前页面地址,保存变量为 currentUrl 第二步,获取目标页面地址,保存变量为 targetUrl 每一个页面地址都有两个情况,1是文件地址,2是路径地址 如果当前地址是路径,那么目标地址就以当前地址叠加,当然,什么../啦/啦,这个自己按路径规则处理 如果当前地址是文件,那么将文件信息删除后保留路径地址,然后叠加 所以,最重要的是判断当前地址的格式是否包含文件信息
  • 打赏
  • 举报
回复
引用 11 楼 paniclp 的回复:
情况1: 有时候浏览器 地址为http://a/b/c.asp 内部链接地址为 myweb.asp 情况2: 有时候浏览器 地址为http://a 内部链接地址为 myweb.asp 情况3: 有时候浏览器 地址为http://a/b 内部链接地址为 b/myweb.asp 但是具体是哪种情况,你是不知道的 但是我最终就想要个正确的网址,你怎么做。 如果是固定的,我当然操作字符串就能弄到。
这种只能你自己再去一个个请求,判断状态是不是HttpStatusCode.Redirect,然后GetResponseHeader("Location")
paniclp 2019-08-14
  • 打赏
  • 举报
回复
情况1:
有时候浏览器 地址为http://a/b/c.asp
内部链接地址为 myweb.asp

情况2:
有时候浏览器 地址为http://a
内部链接地址为 myweb.asp

情况3:
有时候浏览器 地址为http://a/b
内部链接地址为 b/myweb.asp

但是具体是哪种情况,你是不知道的
但是我最终就想要个正确的网址,你怎么做。
如果是固定的,我当然操作字符串就能弄到。



dmankill 2019-08-14
  • 打赏
  • 举报
回复
fullurl.substring(0,fullurl.lastindexof('/'))+innerurl
dmankill 2019-08-14
  • 打赏
  • 举报
回复
你访问当前页面就能够根据当前页面的地址推断出当前页里面所有的相对路径的绝对路径
dmankill 2019-08-14
  • 打赏
  • 举报
回复
浏览器是根据地址来解析的,浏览器的地址栏就有前面的地址 http://www.sscopper.com/Website/

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧