Delphi编程之爬取贴吧多页帖子图片
接着上一篇文章说一下我们如何爬取多页帖子的图片。
第一步,还是随便找个贴吧,这次我们就找图片相对较少的射雕英雄传吧。
把页面拉到最底下,在页码区域单击右键,选择检查。
在这里我们看到了页码的代码区域,蓝色字体就是页码的链接地址,比如第二页的地址:
"http://tieba.baidu.com/f?kw=%E5%B0%84%E9%9B%95%E8%8B%B1%E9%9B%84%E4%BC%A0&ie=utf-8&pn=50"
其中,%E5%B0%84%E9%9B%95%E8%8B%B1%E9%9B%84%E4%BC%A0是贴吧名字的UTF-8格式。
按照显示的数据分析得到,页码就是在后面加上pn=50*n,根据这个规律,我们输入http://tieba.baidu.com/f?kw=%E5%B0%84%E9%9B%95%E8%8B%B1%E9%9B%84%E4%BC%A0&ie=utf-8&pn=0,成功返回了第一页的页面,那么我们可以认为http://tieba.baidu.com/f?kw=%E5%B0%84%E9%9B%95%E8%8B%B1%E9%9B%84%E4%BC%A0&ie=utf-8&pn=后面加上50*n就可以得到任何一页的页面,n从0开始计数。
第二步,思路中,根据第一步的分析结果,不难得出页码的地址,在编写代码的时候可以用一个字符串数组来存储。
每获得一个页码,就用idhttp的get来获取这个页面的源码,那么就可以用上一篇文章分析的方法来获得当页所有楼层图片的下载地址。有了这个思路,我们开始写代码。
这次只用2个按钮就可以了,一个分析地址,一个下载图片。
全局变量:
addr: array [0 .. 20] of string;
htm: array [0 .. 20] of string;
tieziaddr, tiezihtm: array [0 .. 49] of string;
字符转UTF8函数:
Function ToUTF8(str: string): string;
var
b: Byte;
begin
for b in BytesOf(UTF8Encode(str)) do
Result := Format('%s%%%.2x', [Result, b]);
end;
获取地址button:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
n: integer;
tieba, str, bb, cc: string;
x, y, z, zz: integer;
tiezistr: string;
begin
Memo1.Clear;
Memo2.Clear;
Memo3.Clear;
tieba := ToUTF8(LabeledEdit1.Text);
if LabeledEdit2.Text = '' then
begin
n := 1;
end
else
begin
n := strtoint(LabeledEdit2.Text);
end;
for i := 0 to n - 1 do
begin
addr[i] := 'http://tieba.baidu.com/f?ie=utf-8&kw=' + tieba + '&fr=search' +
'&pn=' + inttostr(i * 50);
htm[i] := IdHTTP1.Get(addr[i]);
Memo1.Lines.add(htm[i]);
x := pos('参与本吧讨论', htm[i]);
str := copy(htm[i], x, length(htm[i]) - x);
while true do
begin
y := pos('<a href="/p/', str);
str := copy(str, y + 10, length(str) - y - 10);
if y = 0 then
begin
break;
end;
bb := copy(str, 0, 12);
Memo2.Lines.add('https://tieba.baidu.com/' + bb);
tiezistr:= IdHTTP1.Get('https://tieba.baidu.com/' + bb);
while true do
begin
z := pos('<img class="BDE_Image" src="', tiezistr);
tiezistr := copy(tiezistr, z + 28, length(tiezistr) - z - 28);
zz := pos('.jpg', tiezistr);
if z = 0 then
begin
break;
end;
cc := copy(tiezistr, 0, zz + 3);
Memo3.Lines.add(cc);
end;
end;
end;
end;
下载图片button:
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
h: TIdHTTP;
res: String;
MyStream: TMemoryStream;
begin
for i := 1 to Memo3.Lines.Count do
begin
MyStream := TMemoryStream.Create;
h := TIdHTTP.Create(nil);
try
h.Get(Memo3.Lines[i - 1], MyStream);
MyStream.SaveToFile('C:\Users\Vico\Desktop\test\download\' + inttostr(i) +
'.jpg');
except
showmessage('网络出错!');
MyStream.Free;
exit;
end;
MyStream.Free;
end;
end;
下面是程序运行效果:
运行效果
下载的结果
总结:其实今天的文章没有太多的进步,主要是针对昨天的文章加以补充,是我分析的一个循环获取多页图片的想法和思路,希望能对大家有所帮助。需要注意的是:我上面写的代码,是有一个大问题的,在获取非常多页面的时候,或者图片非常多的贴吧的时候,单线程是坚决不推荐用的,一定要记得用多线程去获取数据和下载图片,切记!这也是我选择射雕英雄传吧来下载图片的原因,图片少。
Delphi编程之爬取贴吧多页帖子图片的更多相关文章
- Delphi编程之爬取贴吧图片最终版
接着前面两篇文章的内容,我们今天把这个贴吧爬取图片的程序完善,让它具有可以下载贴吧多页和帖子多页图片的能力. 主界面设计如下,包含3个labelededit,3个button,1个memo,1个str ...
- Delphi编程之爬取贴吧帖子图片
大家如果经常在逛贴吧的时候,会看到很多帖子里有很多好看的图片,都想下载下来留存的话,常规的方法只能一张一张点击右键,然后图片另存为,这样的方法对于图片少的来说没什么,要是图片超过100张,200张,那 ...
- 利用python的爬虫技术爬取百度贴吧的帖子
在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...
- 【Python3 爬虫】14_爬取淘宝上的手机图片
现在我们想要使用爬虫爬取淘宝上的手机图片,那么该如何爬取呢?该做些什么准备工作呢? 首先,我们需要分析网页,先看看网页有哪些规律 打开淘宝网站http://www.taobao.com/ 我们可以看到 ...
- 【学习笔记】Python 3.6模拟输入并爬取百度前10页密切相关链接
[学习笔记]Python 3.6模拟输入并爬取百度前10页密切相关链接 问题描述 通过模拟网页,实现百度搜索关键词,然后获得网页中链接的文本,与准备的文本进行比较,如果有相似之处则代表相关链接. me ...
- Python爬虫爬取百度贴吧的帖子
同样是参考网上教程,编写爬取贴吧帖子的内容,同时把爬取的帖子保存到本地文档: #!/usr/bin/python#_*_coding:utf-8_*_import urllibimport urlli ...
- [python爬虫] Selenium定向爬取虎扑篮球海量精美图片
前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...
- 使用python爬取百度贴吧内的图片
1. 首先通过urllib获取网页的源码 # 定义一个getHtml()函数 def getHtml(url): try: page = urllib.urlopen(url) # urllib.ur ...
- scrapy爬取校花网男神图片保存到本地
爬虫四部曲,本人按自己的步骤来写,可能有很多漏洞,望各位大神指点指点 1.创建项目 scrapy startproject xiaohuawang scrapy.cfg: 项目的配置文件xiaohua ...
随机推荐
- CentOS 7下安装GUI图形界面
https://www.linuxidc.com/Linux/2017-03/141465.htm
- CF-95C-建图+最短路
http://codeforces.com/problemset/problem/95/C n点m边(无向有权),每个点有一个司机(Ti,Ci)表示支付Ci元走Ti长度且必须停在节点才合法,一个司机只 ...
- zzw原创_cmd下带jar包运行提示 “错误: 找不到或无法加载主类 ”
在windows下编译java,由于是临时测试一下文件,不想改classpath,就在命令行中用 -cp 或classpath引入jar包,用javac编译成功,便使用java带-cp 或classp ...
- arrow function
简介 JavaScript 中,函数可以用箭头语法(”=>”)定义,有时候也叫“lambda表达式”.这种语法主要意图是定义轻量级的内联回调函数.例如: // Arrow function: [ ...
- 网络编程-day4
#服务端 import socketserver class Myserver(socketserver.BaseRequestHandler): def handle(self): while 1: ...
- Java集合类(转自hey平平)
一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...
- awk shell
作业一:整理博客,内容包含awk.变量.运算符.if多分支 awk 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2 ...
- 活代码LINQ——09
一.代码 ' Fig. 9.7: LINQWithListCollection.vb ' LINQ to Objects using a List(Of String). Module LINQWit ...
- Java——值传递与引用传递
1.基本类型和引用类型在内存中的保存 (1)基本类型的变量保存原始值,即它代表的值就是数值本身: 基本类型在声明变量时就为它分配了空间: 基本类型在参数传递过程中属于值传递,也就是复制一份数据 ...
- SQLite3的MFC使用
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,支持跨平台,操作简单,能够使用很多语言直接创建数据库.官方网站:www.sqlite.org 在VC环境下编写连接SQLite的 ...