Chinaunix

标题: 如何通过自己的程序读取网页源码? [打印本页]

作者: ztianshan    时间: 2008-03-06 21:54
标题: 如何通过自己的程序读取网页源码?
我想在linux下用c 编写一个程序来读取网页中的源码,再提取网页中自己想要的类容,
具体是要自己的程序能通过baidu网搜索到有email地址的网页,再在网页源码中提取出email。
不知道如何才能通过c写的程序去自动搜索,再读取网页的类容!!!
  
自己一点眉目都没有。网上看到有用其他语言,如Dephi来实现的,不知道用c 在
linux下是否可以实现这样的功能,大家帮忙看看 吧!!
作者: system888net    时间: 2008-03-06 21:59
:wink:  方法多了, 主要是用http 与web服务器交互通信,从取到的html源码中按规则过滤提取...
作者: ztianshan    时间: 2008-03-06 22:20
我初学编程,这句  "主要是用http 与web服务器交互通信"  我不懂啊!!  能不能帮忙细说一下啊!!
想麻烦高手能有空的时候再仔细解释一下,  我搜了一下,好像也没有解释这个的!!  麻烦啦!!!
作者: Kevin_zqw    时间: 2008-03-06 22:27
简单的说,就是你构造一个HTTP请求,发送给服务器,服务器就会把你请求的页面传输给你啦。。
作者: 涩兔子    时间: 2008-03-07 01:13
请参考 http://trac.lcuc.org.cn/public/t ... t/test_filesystem.c 的 /* HTML filter */
作者: ztianshan    时间: 2008-03-07 14:25
原帖由 Kevin_zqw 于 2008-3-6 22:27 发表
简单的说,就是你构造一个HTTP请求,发送给服务器,服务器就会把你请求的页面传输给你啦。。



你说的这个HTTP请求是要用socket来实现吧!!!
作者: x911    时间: 2008-03-07 14:30
楼主什么都不懂,帮也白帮。大家还是省省力气吧
作者: ztianshan    时间: 2008-03-07 15:29
原帖由 x911 于 2008-3-7 14:30 发表
楼主什么都不懂,帮也白帮。大家还是省省力气吧



哎!! 何必嘞!!  我才学了一点linux下的编程,本来想在老师那里找个项目来做, 老师不想在linux下做软件,只好自己拿这个项目来请教大家了,自己又没做过这类东西,当然白痴一个,如果x911看不起我这样的白痴,还请高台贵口 不要让别人也不来帮我,
如果想嘲笑我这种人,我也没意见, 只要大家能帮忙。

没办法 谁叫我读了个垃圾国家的垃圾大学呢!!  人家老师好像都没看得起我这种自己抱这linux学的白痴
作者: qinyd    时间: 2008-03-07 16:07
给你一个用 Shell 写的例子。 提取某一网站用户信息的

#!/bin/sh
FILE=./tmp
FILE1=./userid
FILE2=./MemberConnect

rm -f $FILE
rm -f $FILE1
rm -f $FILE2
COUNTER=1
while [ $COUNTER -lt 1500 ]
do
STR="http://www.XXXXXX.cn/index/yp.aspx?currentPage=${COUNTER}&province=&city=&county=&companyname=&transportcorridor="
echo $STR
wget $STR -O $FILE
grep '/Company/' $FILE | cut -f 3 -d"/"  >> $FILE1

COUNTER=`expr "$COUNTER" "+" 1`
rm -f $FILE
done

for i in `cat userid`
do
STR="http://www.XXXXXX.cn/Company/${i}/contacts/"
echo $STR
wget $STR -O $FILE

# 联系人 电话 手机 传真 QQ 公司类型 公司网站 公司地址 Email
grep '<li class="CompanyBaseContent">' $FILE | cut -f 2 -d'>' | cut -f 1 -d'<' | sed -e :a -e '$!N; s/\n/\t/;ta' >> $FILE2
echo "隔离标志" >> $FILE2
grep 'Email:' $FILE | cut -f 7 -d'E' | sed -e :a -e '$!N; s/\n/\t/;ta' >> $FILE2

rm -f $FILE
done
作者: leemj_226    时间: 2008-03-07 16:45
标题: 回复 #8 ztianshan 的帖子
1,创建一个TCP的Socket
2,连接到对应的web服务器,
3,发送Http请求,去请求相应的pages
4,web Server会响应你的请求,并回复page的源码给你
5,最后就是你自己的解析过程了

注:
     1。最好是了解一下Http协议的知识,另外如果你请求的页面太大,可能你收到的是压缩格式的。
     2。顺便给lz讲个故事:(希望lz能从中体会些东西)

      话说大学士苏东坡和他那个和尚朋友出游,苏东坡问和尚:我站在你面前向什么? 和尚回答说:像尊佛。和尚反问。苏东坡答:像一砣屎。回家后,苏东坡象苏小妹提起此事。小妹说:哥哥心中原来有一砣屎呀。(听于丹老师讲的,我拙与描述,见笑)
作者: 涩兔子    时间: 2008-03-07 16:53
libcurl + glibc正则表达式

可以参考 http://trac.lcuc.org.cn/public/t ... est/TestSirCurl.cpp
作者: ztianshan    时间: 2008-03-07 22:28
现在我已经把以下这两步做到了:

1,创建一个TCP的Socket
2,连接到对应的web服务器,

我通过发送数据得到了baidu的首也源码,但是我不知道如何让服务器返回搜索后的页面,
如何写这个Http请求啊?? 我在网上搜的 没有具体写到这个的!!
作者: system888net    时间: 2008-03-08 21:03
标题: 回复 #12 ztianshan 的帖子
看一下submit的原理
作者: benjiam    时间: 2008-03-09 09:29
给一个 我写的例子吧

url 代表你要提交的baidu页面的url
host 代表 域名 就是你的www.baidu.com
msg = "POST " + url +" HTTP/1.1\r\nHOST: " + host +"\r\nContent-Type: application/x-www-form-urlencoded\r\n";
string strlen = "Content-Length: ";
               
string requestkey = "t1=" + key1 + "&t2=" +key2;
requestkey  就是你的请求。  如果对于web这方面实在没有概念,建议你看一下书。

t1 t1 都是web页面上面 input 的名字  key1 key2就是你要求得东西。

具体是什么 自己检查一下baidu首页就可以了
最后
char buff[1024] ={0};
sprintf(buff,"%d",requestkey.length());

最后的请求内容为 msg  + strlen + buff+ "\r\n\r\n" + requestkey
把这个送出去, 然后recv 就可以获取到内容了。

当然还有很多可以优化的地方了。 自己慢慢磨搜
作者: benjiam    时间: 2008-03-09 09:31
还有一点 提交数据需要使用url编码。 中文必须进行url编码。否则会有问题。
也就是key1 key2的值要url编码




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2