- 积分
- 2641
- 在线时间
- 363 小时
- 最后登录
- 2024-11-21
蜘蛛侠
- 返现券
- 0
- 金币
- 202
- 金钱
- 2998
- 注册时间
- 2018-9-9
|
最近半个月,我开始自学python爬虫。这是我第一个独立完成的脚本,发帖纪念一下。
首先要向游大声明一下,此贴纯粹为学习交流、经验分享之用,本人绝无恶意爬取蚂蚁论坛,仅出于练手目的爬取阿奔发表的图片,代码里也设置了暂停时间,防止服务器请求过多无法响应。以后再不会爬取蚂蚁论坛来练手(除非游大做了反爬措施,那可能还会再练手一次,不过现在还没这水平)。
1)一开始的需求构想:提取图片地址,筛除非福利图,只保留美女图片(嘿嘿),保存到同一个文件夹里方便观看;
实际效果:无筛除功能,因为非福利图的来源是新浪图片(大概是),但有些福利图也是这个来源,故不作筛除(还是贪心啊,只要是福利图就不想放过);
2)实际运行结果:在爬取到936张图片(1.99GB)后,由于未知原因程序终止,报错信息:urllib.error.HTTPError: HTTP Error 404: Not Found
现在还是找不出为什么报这个错;另外新手的代码难免繁杂,若有(阿)高(奔)手(哥)看不下去,不吝指点一下怎么写得更简洁,或者怎么解决这个报错,感激不尽!
废话有点多,下面代码奉上(由于cookie含有个人登录信息,怕有高手破解,故用'***'代替):
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
import re
import os
import time
import socket
socket.setdefaulttimeout(20) # 设置socket层的超时时间为20秒
url_t = 'http://www.mayi.sg/home.php?mod=space&uid=61184&do=thread&view=me&order=dateline&from=space&'
def handle_request(url):
headers = {
'Cookie': '*******************************************************************************',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
}
req = urllib.request.Request(url=url, headers=headers)
content = urllib.request.urlopen(req).read()
return content
def save(img_url,img_name):
print('正在保存: {}'.format(img_name))
if not os.path.exists('./images'):
os.mkdir(os.path.abspath('./images'))
img = handle_request(img_url)
with open(os.path.abspath('./images/{}').format(str(img_name)), 'wb') as fp:
fp.write(img)
def img_Spider(pa_url):
#解析内容,生成图片url的列表及图片名列表
content = handle_request(pa_url).decode('gbk')
soup = BeautifulSoup(content, 'lxml')
#定位到:div align="left"
img_group = soup.find_all('div', align="left")
for img_subgroup in img_group:
img_subgroup = str(img_subgroup.find_all('font' > 'font' > 'font'))
url_pattern = re.compile(r'.*?src="(.*?)".*?',re.S)
try:
img_url = url_pattern.findall(img_subgroup)[0]
# 返回的是一个列表,其中是4个相同的图片url地址,所以取其中任意一个元素
imgname_pattern = re.compile(r'[^/]+(?!.*jpg|png|gif)')
# 图片名
img_name = imgname_pattern.findall(img_url)[-1]
# 保存图片
save(img_url, img_name)
except IndexError:
pass
def main():
print('=====开始爬取阿奔发布的图片=====')
#拼接所有入口的url,构建循环
page = 1
while page >= 0:
data_url = {
'page': page
}
data = urllib.parse.urlencode(data_url)
main_url = url_t + data
print('开始爬取第{}个主页: '.format(page) + main_url)
#构建请求对象,发送请求,获取内容
content = handle_request(main_url).decode('gbk')
#解析页面上所有要爬取的链接,生成列表
soup = BeautifulSoup(content, 'lxml')
web_list = soup.select('th')[1:]
#遍历列表,依次获取要爬取的具体页面,启动爬虫
for url in web_list:
pa_url = 'http://www.mayi.sg/' + url.a['href']
img_Spider(pa_url)
time.sleep(6)
time.sleep(10)
page += 1
print('全部爬取结束!')
if __name__ == '__main__':
main()
|
|