有关网页数据采集的几个问题(200分相送)

zhyindividual 2007-12-01 02:37:58
有关网页数据采集的几个问题(200分相送)

1.C#如何伪造来路地址? (50分)
在数据采集时,有些网站/论坛有来路地址验证,如何实现数据的采集?

2.如何实现Discuz论坛的自动发帖/回复功能? (150分)

请给出经过测试的关键代码,谢谢.

对于解决了问题的朋友,予以全部分数相送.(限于级别不能同时给200分,但只要解决了问题绝对另开贴给分)

再次谢谢与期望各位热心的朋友予以帮助.
...全文
237 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhyindividual 2007-12-17
  • 打赏
  • 举报
回复
没人回啦?再顶上下.要没人回,明天结贴了.
zhyindividual 2007-12-11
  • 打赏
  • 举报
回复
..............惭愧的很,本人对这么一段代码很是头痛,能不能给我一个可运行的实例?
asp.net界面,向某个网站提交数据就OK.
感谢!
如果不便公开发布的话,我的邮箱是 tjz_86@163.com
shrinerain 2007-12-10
  • 打赏
  • 举报
回复
呃... Google上一下很多的...

下面这个例子是用socket发SOAP消息, 当然你也可以用它发HTTP消息.

Console.WriteLine("Calling Web Method GetTitles() using sockets");
string input = "testing";
string soapMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
soapMessage += "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchemainstance\"";
soapMessage += " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"";
soapMessage += " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">";
soapMessage += "<soap:Body>";
soapMessage += "<GetTitles xmlns=\"http://tempuri.org/\">";
soapMessage += "<filter>" + input + "</filter>";
soapMessage += "</GetTitles>";
soapMessage += "</soap:Body>";
soapMessage += "</soap:Envelope>";
Console.WriteLine("SOAP message is: \n");
Console.WriteLine(soapMessage);
string host = "localhost";
string webService = "/TestAuto/Ch8/TheWebService/BookSearch.asmx";
string webMethod = "GetTitles";
IPHostEntry iphe = Dns.Resolve(host);
IPAddress[] addList = iphe.AddressList; // addList[0] == 127.0.0.1
EndPoint ep = new IPEndPoint(addList[0], 80); // ep = 127.0.0.1:80
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
socket.Connect(ep);
if (socket.Connected)
Console.WriteLine("\nConnected to " + ep.ToString());
else
Console.WriteLine("\nError: socket not connected");
string header = "POST " + webService + " HTTP/1.1\r\n";
header += "Host: " + host + "\r\n";
header += "Content-Type: text/xml; charset=utf-8\r\n";
header += "Content-Length: " + soapMessage.Length.ToString() + "\r\n";
header += "Connection: close\r\n";
header += "SOAPAction: \"http://tempuri.org/" + webMethod + "\"\r\n\r\n";
Console.Write("Header is: \n" + header);
string sendAsString = header + soapMessage;
byte[] sendAsBytes = Encoding.ASCII.GetBytes(sendAsString);
int numBytesSent = socket.Send(sendAsBytes, sendAsBytes.Length,
SocketFlags.None);
Console.WriteLine("Sending = " + numBytesSent + " bytes\n");
byte[] receiveBufferAsBytes = new byte[512];
string receiveAsString = "";
string entireReceive = "";
int numBytesReceived = 0;
while ((numBytesReceived = socket.Receive(receiveBufferAsBytes, 512,
SocketFlags.None)) > 0 )
{
receiveAsString = Encoding.ASCII.GetString(receiveBufferAsBytes, 0,
numBytesReceived);
entireReceive += receiveAsString;
}
zhyindividual 2007-12-10
  • 打赏
  • 举报
回复
有几天没来看了.没想到错过了 Shrinerain 的指点.....

感谢,貌似这个提到点子上了, 请问能够提供实际的解决方案麽?

1.如果是HOST的话,C# 可以实现麽?必须使用Socket?
2.能否提供一个简单的实例,我对Socket的编程不是很懂.再次感谢!!!
shrinerain 2007-12-06
  • 打赏
  • 举报
回复
手工提交会吧?

就是cmd里面 telnet 论坛地址 80

然后按照HTTP 1.1协议,摸黑把字符串打进去就可以了.
shrinerain 2007-12-06
  • 打赏
  • 举报
回复
一般论坛判断, 会检查Referer, 或者Host, 或者cookie.

你手工提交HTTP Post信息给Discuz论坛, 分别修改Referer, Host以及cookie.
看看具体是哪个属性让Discuz显示这个错误信息.

如果是Referer或cookie好办, 如果是Host的话, HttpWebRequest不能修改Host.

你得采用最底层的方法, 直接Socket.

zhyindividual 2007-12-06
  • 打赏
  • 举报
回复
在顶一次,要再没人解决,也只有结贴了:(
blestcc 2007-12-05
  • 打赏
  • 举报
回复
這樣的話可能不是來路地址不正確的問題,應該是在服務器端增加了其他驗證.
你還可以自己構建http的資料包post到服務器來僞造來路地址試一下,不過我想結果應該還是一樣的
zhyindividual 2007-12-05
  • 打赏
  • 举报
回复
感谢楼上朋友的回复

我的想法是 ,直接在IE里回复是可以的,那么也就是说是判断了来路地址,POST数据看了,没什么特别的地方.不知道有哪位碰到并解决过这个问题,望分享下.
zhyindividual 2007-12-04
  • 打赏
  • 举报
回复
没人回啊?还是没人看到???
zhyindividual 2007-12-03
  • 打赏
  • 举报
回复
To楼上的>>
感谢回复,不过这个不是关键问题.

继续等待...
hblhshb 2007-12-03
  • 打赏
  • 举报
回复
如果验证是cookie的话还好说,如果是Session验证的,还是放弃吧,好像没什么办法,帮你顶
zhyindividual 2007-12-03
  • 打赏
  • 举报
回复
再次顶一下,期待解决.
zhyindividual 2007-12-02
  • 打赏
  • 举报
回复
感谢大家的回复,顶下,希望遇上在这方面有研究的朋友予以解惑。。
aoxin 2007-12-02
  • 打赏
  • 举报
回复
来路地址是由服务器去判断的,所以在未知服务器判断规则的前提下是很难完成的..但却可以多试几个.
至于自动回复嘛,,,现在很我论坛都有验证,,这个是最难搞的...
龙宜坡 2007-12-02
  • 打赏
  • 举报
回复
关注下,没做过!
zhyindividual 2007-12-02
  • 打赏
  • 举报
回复
TO>>blestcc:
1.感谢你的回复。Referer属性我知道,除此以外还有其他方法没?其实我问这个问题是由于第2个问题的原因,我使用了这种方式,不过貌似没达到预期的效果。
2.o(∩_∩)o...,如果是使用WebRequest的话,代码都差不多。其实我的实际情况是这样的。

这也算回复 FlashElf 朋友对问题2的疑问。

我买了个火车头的采集器,不过当对Discuz论坛进行自动发布时得到如下提示:

您的请求来路不正确或验证字串不符,无法提交。如果您安装了某种默认屏蔽来路信息的个人防火墙软件(如 Norton Internet Security),请设置其不要禁止来路信息后再试。

网上搜索了一阵,貌似很多这样的问题,但都没有确切的解决方案,所以有此一问,希望各位朋友能够予以解惑。谢谢。
lwl0376 2007-12-01
  • 打赏
  • 举报
回复
关注
曲滨_銘龘鶽 2007-12-01
  • 打赏
  • 举报
回复
1、如果你说的 来路地址 是“引用页”的话设置 HttpWebRequest.Referer

2、问题比较....,怀疑楼主居心不良拒绝回答 哈哈
blestcc 2007-12-01
  • 打赏
  • 举报
回复
因為以前是在簡體系統上寫的,現在用的是繁體系統,所以注釋部分亂碼,無視注釋就OK了
加载更多回复(1)

110,536

社区成员

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

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

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