接着上一篇文章说一下我们如何爬取多页帖子的图片。

第一步,还是随便找个贴吧,这次我们就找图片相对较少的射雕英雄传吧。

把页面拉到最底下,在页码区域单击右键,选择检查。

在这里我们看到了页码的代码区域,蓝色字体就是页码的链接地址,比如第二页的地址:

"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编程之爬取贴吧多页帖子图片的更多相关文章

  1. Delphi编程之爬取贴吧图片最终版

    接着前面两篇文章的内容,我们今天把这个贴吧爬取图片的程序完善,让它具有可以下载贴吧多页和帖子多页图片的能力. 主界面设计如下,包含3个labelededit,3个button,1个memo,1个str ...

  2. Delphi编程之爬取贴吧帖子图片

    大家如果经常在逛贴吧的时候,会看到很多帖子里有很多好看的图片,都想下载下来留存的话,常规的方法只能一张一张点击右键,然后图片另存为,这样的方法对于图片少的来说没什么,要是图片超过100张,200张,那 ...

  3. 利用python的爬虫技术爬取百度贴吧的帖子

    在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...

  4. 【Python3 爬虫】14_爬取淘宝上的手机图片

    现在我们想要使用爬虫爬取淘宝上的手机图片,那么该如何爬取呢?该做些什么准备工作呢? 首先,我们需要分析网页,先看看网页有哪些规律 打开淘宝网站http://www.taobao.com/ 我们可以看到 ...

  5. 【学习笔记】Python 3.6模拟输入并爬取百度前10页密切相关链接

    [学习笔记]Python 3.6模拟输入并爬取百度前10页密切相关链接 问题描述 通过模拟网页,实现百度搜索关键词,然后获得网页中链接的文本,与准备的文本进行比较,如果有相似之处则代表相关链接. me ...

  6. Python爬虫爬取百度贴吧的帖子

    同样是参考网上教程,编写爬取贴吧帖子的内容,同时把爬取的帖子保存到本地文档: #!/usr/bin/python#_*_coding:utf-8_*_import urllibimport urlli ...

  7. [python爬虫] Selenium定向爬取虎扑篮球海量精美图片

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  8. 使用python爬取百度贴吧内的图片

    1. 首先通过urllib获取网页的源码 # 定义一个getHtml()函数 def getHtml(url): try: page = urllib.urlopen(url) # urllib.ur ...

  9. scrapy爬取校花网男神图片保存到本地

    爬虫四部曲,本人按自己的步骤来写,可能有很多漏洞,望各位大神指点指点 1.创建项目 scrapy startproject xiaohuawang scrapy.cfg: 项目的配置文件xiaohua ...

随机推荐

  1. 找出点的密集区域,javascript实现,html5 canvas效果图

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  2. Model First 开发方式

    概述 在项目一开始,没有数据库时,可以借助 EF 设计模型,然后根据模型同步完成数据库中表的创建,这就是 Model First 开发方式. 总结一点就是:现有模型再有表. 创建 Model Firs ...

  3. [luogu P3960] [noip2017 d2t3] 队列

    [luogu P3960] [noip2017 d2t3] 队列 题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Syl ...

  4. .NET反射简单应用———遍历枚举字段

    反射(Reflection)是一个非常强大的工具,可以用来查看和遍历类型和类型成员的元数据:动态创建类型实例,动态调用所创建的实例方法.字段.属性:迟绑定方法和属性.此次要介绍的是使用反射查看类型成员 ...

  5. goodsSearch初始化选中代码

    watch: { selectGoodsList (val) { let list = [] val.forEach(item => { this.goodsList.forEach((tag, ...

  6. Linux c codeblock的使用(四):创建自己的静态函数库

    从我之前的博文当中,大家应该大概了解了linux下的函数库究竟是一个什么样的东西.linux下的函数库其实就像windows中的dll文件,里面包含了程序运行所需要的函数. 其实无论是我们使用linu ...

  7. Rhino学习教程——1.5

    图形面板 图形面板是Rhino为了方便用户操作设置的一个区域,默认提供了“属性”.“图层”.“说明”3个面板(我自定义过了,新增了一个“显示”功能 ). trip:如果要打开更多的图版,可以点击图形面 ...

  8. bzoj2748

    题解: 简单dp 代码: #include<bits/stdc++.h> using namespace std; ; int n,x,m,a[N],f[N][N]; int main() ...

  9. 前端开发面试题总结之——JAVASCRIPT(二)

    ___________________________________________________________________________________ 相关知识点 数据类型.运算.对象 ...

  10. NFS, web,负载均衡,Nginx yum 源码安装

    作业一:nginx服务1.二进制安装nginx 2.作为web服务修改配置文件 3.让配置生效,验证配置  [root@localhost ~]# systemctl stop firewalld.s ...