1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173


​一、IDHTTP的基本用法​​​​IDHttp和WebBrowser一样,都可以实现抓取远端网页的功能,但是http方式更快、更节约资源,缺点是需要手动维护cook,连接等​​​​IDHttp的创建,需要引入IDHttp​​​​procedure​​​​InitHttp();​​​​begin​​​​​​​​http := TIdHTTP​​​​.​​​​Create(​​​​nil​​​​);​​​​​​​​http​​​​.​​​​ReadTimeout := ​​​​30000​​​​;​​​​​​​​http​​​​.​​​​OnRedirect := OnRedirect;​​​​​​​​http​​​​.​​​​Request​​​​.​​​​Accept := ​​​​'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, */*'​​​​;​​​​​​​​http​​​​.​​​​Request​​​​.​​​​AcceptLanguage := ​​​​'zh-cn'​​​​;​​​​​​​​http​​​​.​​​​Request​​​​.​​​​ContentType := ​​​​'application/x-www-form-urlencoded'​​​​;​​​​​​​​http​​​​.​​​​Request​​​​.​​​​UserAgent := ​​​​'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 1.1.4322)'​​​​;​​​​​​​​http​​​​.​​​​ProxyParams​​​​.​​​​ProxyServer := ​​​​'代理服务器地址'​​​​;​​​​​​​​http​​​​.​​​​ProxyParams​​​​.​​​​ProxyPort := ​​​​'代理服务器端口'​​​​;​​​​end​​​​;​​​​二、如何取得服务端返回的cookie信息,并添加到http的request对象中​​​​procedure​​​​Setcookie;​​​​var​​​​​​​​i: ​​​​Integer​​​​;​​​​​​​​tmp, cookie: ​​​​String​​​​;​​​​begin​​​​​​​​cookie := ​​​​''​​​​;​​​​​​​​for​​​​i := ​​​​0​​​​to​​​​http​​​​.​​​​Response​​​​.​​​​RawHeaders​​​​.​​​​Count - ​​​​1​​​​do​​​​​​​​begin​​​​​​​​tmp := http​​​​.​​​​Response​​​​.​​​​RawHeaders[i];​​​​​​​​if​​​​pos(​​​​'set-cookie: '​​​​, LowerCase(tmp)) = ​​​​0​​​​then​​​​Continue;​​​​​​​​tmp := Trim(Copy(tmp, Pos(​​​​'Set-cookie: '​​​​, tmp) + Length(​​​​'Set-cookie: '​​​​), Length(tmp)));​​​​​​​​tmp := Trim(Copy(tmp, ​​​​0​​​​, Pos(​​​​';'​​​​, tmp) - ​​​​1​​​​));​​​​​​​​if​​​​cookie = ​​​​''​​​​then​​​​cookie := tmp ​​​​else​​​​cookie := cookie + ​​​​'; '​​​​+ tmp;​​​​end​​​​;​​​​if​​​​cookie <> ​​​​''​​​​then​​​​begin​​​​​​​​for​​​​i := ​​​​0​​​​to​​​​http​​​​.​​​​Request​​​​.​​​​RawHeaders​​​​.​​​​Count - ​​​​1​​​​do​​​​​​​​begin​​​​​​​​tmp := http​​​​.​​​​Request​​​​.​​​​RawHeaders[i];​​​​​​​​if​​​​Pos(​​​​'cookie'​​​​, LowerCase(tmp)) = ​​​​0​​​​then​​​​Continue;​​​​​​​​http​​​​.​​​​Request​​​​.​​​​RawHeaders​​​​.​​​​Delete(i);​​​​​​​​Break;​​​​​​​​end​​​​;​​​​​​​​http​​​​.​​​​Request​​​​.​​​​RawHeaders​​​​.​​​​Add(​​​​'cookie: '​​​​+ cookie);​​​​end​​​​;​​​​end​​​​;​​​​三、如何取得网页中的所有连接,对代码做修改你也可以实现查找所有图片等等​​​​function​​​​GetURLList(Data: ​​​​String​​​​): TStringList;​​​​var​​​​i: ​​​​Integer​​​​;​​​​List: TStringList;​​​​tmp: ​​​​String​​​​;​​​​function​​​​Split(Data, Node: ​​​​String​​​​): TStringList;​​​​​​​​var​​​​​​​​Count, i, j: ​​​​Integer​​​​;​​​​​​​​function​​​​GetFieldCount(Data, Node: ​​​​String​​​​): ​​​​Integer​​​​;​​​​​​​​var​​​​​​​​i: ​​​​Integer​​​​;​​​​​​​​begin​​​​​​​​Result := -​​​​1​​​​;​​​​​​​​i := Pos(Node, Data);​​​​​​​​if​​​​i = ​​​​0​​​​then​​​​Exit;​​​​​​​​Result := ​​​​0​​​​;​​​​​​​​while​​​​i <> ​​​​0​​​​do​​​​​​​​begin​​​​​​​​Inc(Result);​​​​​​​​Delete(Data, ​​​​1​​​​, i + Length(Node) - ​​​​1​​​​);​​​​​​​​i := Pos(Node, Data);​​​​​​​​end​​​​;​​​​​​​​end​​​​;​​​​​​​​begin​​​​​​​​Result := TStringList​​​​.​​​​Create;​​​​Count := GetFieldCount(Data, Node);​​​​for​​​​i := ​​​​0​​​​to​​​​Count - ​​​​1​​​​do​​​​begin​​​​​​​​j := Pos(Node, Data);​​​​​​​​Result​​​​.​​​​Add(Copy(Data, ​​​​1​​​​, j - ​​​​1​​​​));​​​​​​​​Delete(Data, ​​​​1​​​​, j + Length(Node) - ​​​​1​​​​);​​​​end​​​​;​​​​Result​​​​.​​​​Add(Data);​​​​end​​​​;​​​​begin​​​​Result := TStringList​​​​.​​​​Create;​​​​try​​​​​​​​List := split(Data, ​​​​'href='​​​​);​​​​​​​​for​​​​i := ​​​​1​​​​to​​​​List​​​​.​​​​Count - ​​​​1​​​​do​​​​​​​​begin​​​​​​​​tmp := List[i];​​​​​​​​tmp := Copy(tmp, ​​​​0​​​​, Pos(​​​​'</a>'​​​​, tmp) - ​​​​1​​​​);​​​​​​​​tmp := Copy(tmp, ​​​​0​​​​, Pos(​​​​'>'​​​​, tmp) - ​​​​1​​​​);​​​​​​​​if​​​​Pos(​​​​' '​​​​, tmp) <> ​​​​0​​​​then​​​​​​​​tmp := Copy(tmp, ​​​​0​​​​, Pos(​​​​' '​​​​, tmp) - ​​​​1​​​​);​​​​​​​​tmp := Q_ReplaceStr(tmp, ​​​​Char​​​​(​​​​34​​​​), ​​​​''​​​​);​​​​​​​​tmp := Q_ReplaceStr(tmp, ​​​​Char​​​​(​​​​39​​​​), ​​​​''​​​​);​​​​​​​​if​​​​not​​​​Compare(CI​​​​.​​​​Key, tmp) ​​​​then​​​​Continue;​​​​​​​​if​​​​Copy(tmp, ​​​​1​​​​, ​​​​7​​​​) <> ​​​​'http://'​​​​then​​​​​​​​begin​​​​​​​​if​​​​Copy(tmp, ​​​​1​​​​, ​​​​1​​​​) = ​​​​'.'​​​​then​​​​tmp := StringReplace(tmp, ​​​​'.'​​​​, ​​​​''​​​​, []);​​​​​​​​if​​​​Copy(tmp, ​​​​1​​​​, ​​​​1​​​​) = ​​​​'.'​​​​then​​​​tmp := StringReplace(tmp, ​​​​'.'​​​​, ​​​​''​​​​, []);​​​​​​​​try​​​​​​​​tmp := ​​​​'http://'​​​​+ http​​​​.​​​​URL​​​​.​​​​Host + ​​​​':'​​​​+ http​​​​.​​​​URL​​​​.​​​​Port + http​​​​.​​​​URL​​​​.​​​​Path + tmp;​​​​​​​​except​​​​​​​​end​​​​;​​​​​​​​end​​​​;​​​​​​​​if​​​​Result​​​​.​​​​IndexOf(tmp) <> -​​​​1​​​​then​​​​Continue;​​​​​​​​Result​​​​.​​​​Add(tmp);​​​​​​​​end​​​​;​​​​​​​​FreeAndNil(List);​​​​except​​​​end​​​​;​​​​end​​​​;​​​​四、如何模拟http的get方法打开一个网页​​​​function​​​​GetMethod(http: TIDhttp; URL: ​​​​String​​​​; Max: ​​​​Integer​​​​): ​​​​String​​​​;​​​​var​​​​RespData: TStringStream;​​​​begin​​​​RespData := TStringStream​​​​.​​​​Create(​​​​''​​​​);​​​​try​​​​​​​​try​​​​​​​​Http​​​​.​​​​Get(URL, RespData);​​​​​​​​Http​​​​.​​​​Request​​​​.​​​​Referer := URL;​​​​​​​​Result := RespData​​​​.​​​​DataString;​​​​​​​​except​​​​​​​​Dec(Max);​​​​​​​​if​​​​Max = ​​​​0​​​​then​​​​​​​​begin​​​​​​​​Result := ​​​​''​​​​;​​​​​​​​Exit;​​​​​​​​end​​​​;​​​​​​​​Result := GetMethod(http, URL, Max);​​​​​​​​end​​​​;​​​​finally​​​​​​​​FreeAndNil(RespData);​​​​end​​​​;​​​​end​​​​;​​​​五、如何模拟http的post方法提交一个网页​​​​function​​​​PostMethod(URL, Data: ​​​​String​​​​; max: ​​​​Integer​​​​): ​​​​String​​​​;​​​​var​​​​PostData, RespData: TStringStream;​​​​begin​​​​RespData := TStringStream​​​​.​​​​Create(​​​​''​​​​);​​​​PostData := TStringStream​​​​.​​​​Create(Data);​​​​try​​​​​​​​try​​​​​​​​if​​​​http = ​​​​nil​​​​then​​​​Exit;​​​​​​​​Http​​​​.​​​​Post(URL, PostData, RespData);​​​​​​​​Result := RespData​​​​.​​​​DataString;​​​​​​​​http​​​​.​​​​Request​​​​.​​​​Referer := URL;​​​​​​​​except​​​​​​​​Dec(Max);​​​​​​​​if​​​​Max = ​​​​0​​​​then​​​​​​​​begin​​​​​​​​Result := ​​​​''​​​​;​​​​​​​​Exit;​​​​​​​​end​​​​;​​​​​​​​Result := PostMethod(URL, Data, Max);​​​​​​​​end​​​​;​​​​finally​​​​​​​​http​​​​.​​​​Disconnect;​​​​​​​​FreeAndNil(RespData);​​​​​​​​FreeAndNil(PostData);​​​​end​​​​;​​​​end​​​​;​​​​六、伪造session​​​​var​​​​My_Cookie,tmpcookie:​​​​string​​​​;​​​​begin​​​​aIdHttp​​​​.​​​​Get(​​​​'http://www.huochepiao.net/'​​​​);​​​​tmpcookie:=aIdHttp​​​​.​​​​Request​​​​.​​​​CustomHeaders​​​​.​​​​Values[​​​​'Set-Cookie'​​​​];​​​​​​​​if​​​​Pos(​​​​';'​​​​,tmpcookie)>​​​​0​​​​then​​​​​​​​My_Cookie:=LeftBStr(tmpcookie,Pos(​​​​';'​​​​,tmpcookie)-​​​​1​​​​)​​​​else​​​​​​​​My_Cookie:= tmpcookie;​​​​//​​​​aIdHTTP​​​​.​​​​Request​​​​.​​​​CustomHeaders​​​​.​​​​Clear;​​​​aIdHTTP​​​​.​​​​Request​​​​.​​​​CustomHeaders​​​​.​​​​Add(​​​​'Cookie:'​​​​+My_COOKIE);​​​​end​​​​;​