我的第一个python爬虫:保护穿不起衣服的小姐姐慈善项目

我的第一个python爬虫:保护穿不起衣服的小姐姐慈善项目


首页分析

首先,让我们在浏览器打开本慈善项目首页,以贤者之心观察网页结构 ——
xiumeim1
最上方是首栏和搜索栏,不是我们需要的;
紧跟着的是急需帮助的小姐姐,本人向来是雨露均沾、一视同仁的,如果只帮助了她们,对其他小姐姐是不公平的,所以这也不是我们需要的;
接下来就是一个4 x 6的表格,每一项都指向一位买不起衣服的可怜小姐姐,我心都软了,所以这应该就是我需要的信息;
接下来是翻页,一共380页,或许会用到,先mark;接下来就是视频列表,什么什么TV,这一看就是骗子,连衣服都穿不起怎么可能买得起TV,休想骗我!所以这部分没有诚信的人我们直接pass。

到这一步我的思路是:中间表格部分每一张图片应该就对应一个URL,指向详情页。让我们查看一下网页源代码,观察到中间部分很多<a class="photosUrl" href="http://www.xiumeim.com/photos/XiuRen-193343.html" >格式的标签,大胆猜测这就是对应的URL,由于小姐姐们来自于不同的慈善机构,所以URL中的XiuRen部分不能作为参考标准,所以我们应该搜索<a class="photosUrl" href="http://www.xiumeim.com/photos/试试,结果有52条,比4 x 6 = 24要多,观察后发现下方视频部分的失信小姐姐也被搜索进来了,所以我们应该在前面加上<span class="name">标签,这样就能够筛选出我们需要的24个URL。

xiumeim_f12

第一步爬取

代码如下:

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
import urllib.request
import urllib.error
from lxml import html

def get_html(url):
'输入URL,获取HTML'
# 浏览器伪装
headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 将opener安装为全局
urllib.request.install_opener(opener)

# 获取HTML
try:
data = urllib.request.urlopen(url).read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
finally:
return data

# 拿到4 x 6个子URL
data = get_html("http://www.xiumeim.com")
sub_urls = html.etree.HTML(data).xpath('//span[@class="name"]/a[@class="photosUrl"]/@href')
# 打印得到24个子URL
for i in sub_urls:
print(i)

OK,拿到了24个子URL,成功了一半:
urls

Debug

参考《PyCharm无法导入lxml包(报错:ModuleNotFoundError: No module named ‘lxml’)解决办法》

详情页分析

接下来让我们在这24位穷的买不起衣服的小姐姐中挑一个翻牌子,看看详情页面的布局。首先是5张小姐姐没有换洗衣服,淋了雨被冻得瑟瑟发抖的大图:
5

在这之后是一个大大的翻页按钮,同时显示了共11页,这应该有助于我们进行循环:

5_nxt

我们查看网页源代码,能够轻易地发现类似<img class="photosImg" src="http://img.xiumeim.com/data/1933/43/15614665188291.jpg" alt="[XIUREN] 2019.06.14 No.1498 王雨纯 [51+1P179M]_0002" />这种格式的标签共5个,所以这应该就是我们需要的贫困证明。同时我们搜索11,能发现<span class="count">(共11页)</span>标签就是我们需要的总页码,后续的循环需要用到。

最后,我们来看看不同页的URL有何特点,第一页URL是http://www.xiumeim.com/photos/XiuRen-193343.html,第二页URL变成了http://www.xiumeim.com/photos/XiuRen-193343-2.html,之后的第n页就是在第一页的URL后加-n,值得注意的是-1并不是第一页,所以第一页要单独处理。

第二步爬取

代码如下:

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
import urllib.request
import urllib.error
from lxml import html

def get_html(url):
'输入URL,获取HTML'
# 浏览器伪装
headers = ("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 将opener安装为全局
urllib.request.install_opener(opener)

# 获取HTML
try:
data = urllib.request.urlopen(url).read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
finally:
return data

# 拿到4 x 6个子URL
data = get_html("http://www.xiumeim.com")
sub_urls = html.etree.HTML(data).xpath('//span[@class="name"]/a[@class="photosUrl"]/@href')
# 处理每个子URL
for h in range(len(sub_urls) ):
# print(sub_urls[h])
sub_data = get_html(sub_urls[h])
# print(sub_data)
# print("--------------------------------------")
# 爬第一页图片
pic_urls = html.etree.HTML(sub_data).xpath('//img[@class="photosImg"]/@src')
# 下载24个URL第一页的每一张图片
for i in range(len(pic_urls) ):
response = urllib.request.urlopen(pic_urls[i])
img = response.read()
# with语句可以保证文件操作的安全性
with open('D://python/little_sister_too_poor_to_afford_clothes/' + str(h+1) + '-' + str(i+1) + '.jpg', 'wb') as f:
f.write(img)

不足

实在是爬得太慢了 - -|||,我有点犯困了,所以我没有所有页都爬,就只爬了24个小姐姐的第一页的5张图片,一共是120张,饶是如此我都已经有点顶不住了。所以就这样吧,当作是一次python爬虫的练手,后续有机会可能会完成整个4层循环的爬取代码。
还有个缺点就是每个寻求帮助的小姐姐良莠不齐,后续如果会学习机器学习的话,或许可以按照个人喜好对所有寻求帮助的小姐姐做一个评分?然后资质合格的才进行爬取这样子,目前来说能力是不足的。
代码放到了我的GitHub仓库,部分运行结果如下:
rst

晚安。

-------------本文结束感谢您的阅读-------------

本文标题:我的第一个python爬虫:保护穿不起衣服的小姐姐慈善项目

文章作者:DragonBaby308

发布时间:2019年07月01日 - 21:02

最后更新:2019年09月22日 - 10:11

原始链接:http://www.dragonbaby308.com/my-1st-crawl/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%