之前使用java做过点爬虫,这次学了下python,特意用python来练习了下爬虫,爬了下煎蛋mm照片,代码如下(先记录下,下次想看图片了可以用~):
import urllib.request
import os,re,sys
import base64
from bs4 import BeautifulSoup
#获取返回的页面内容
def url_open(url):
req = urllib.request.Request(url)
#自定义请求头,获取返回的response,煎蛋上的对访问的Ip好像没做什么控制,因此使用同一台机子也可能作死的爬。。不需要使用多ip
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36')
response = urllib.request.urlopen(url)
return response.read()
# 得到总的图片页数
def get_page(url):
html = url_open(url).decode('utf-8')
htmlSoup = BeautifulSoup(html, "lxml");
totalPage = int(htmlSoup.find("span","current-comment-page").string[1:-1])
return totalPage
# 获取图片的url列表
def find_imgs(page_url):
html = url_open(page_url).decode('utf-8')
hash_list = []
img_addr_list = []
# 找到图片url的hash值,原来的只需要直接获取地址就行了,煎蛋给地址稍微加了点密,因此直接是爬取不到了,这里可以获取图片url经过编码后的值,获取之后对其进行解码(这部分我也是网上看来的)
htmlSoup = BeautifulSoup(html, "lxml");
for eachSpan in htmlSoup.findAll("span","img-hash"):
hash_list.append(eachSpan.string)
# 获取到hash码之后,然后对齐进行解码
for eachHashCode in hash_list:
# 这段是解码的代码
url = base64.b64decode(eachHashCode).decode('utf-8')
img_addr_list.append(url)
# 得到解码后的url列表
return img_addr_list
# 本地图片保存地址
def save_imgs(folder, img_addr_list):
for each in img_addr_list:
filename = each.split('/')[-1]
with open(filename, 'wb') as f:
img = url_open("http:" + each)
f.write(img)
def download_pics(folder = 'OOXX', beginPage = 1, endPage = 2):
#如果文件夹不存在,那么进行创建,并切换当当前路径
try:
if(os.path.isdir(folder) == False):
os.mkdir(folder)
os.chdir(folder)
except FileNotFoundError:
print ("路径出毛病啦!")
sys.exit(1)
# 我这里只对煎蛋网上的妹子图做了爬取
url = "http://jandan.net/ooxx/"
page_num = int(get_page(url))
if beginPage > endPage:
print('开始页数大于结束页数!')
return
if endPage > page_num:
print('页数超过了总数!下载到最后一页!')
endPage = page_num
for currentPage in range(beginPage, endPage + 1):
page_url = url + "page-" + str(currentPage) + "#comments"
img_addr_list = find_imgs(page_url)
#print(img_addr_list)
save_imgs(folder, img_addr_list)
print("第%d页已下载完成" % currentPage)
if __name__ == '__main__':
#download_pics()
folder = input("输入图片保存路径,默认当前路径下!路径格式(F:/aa/):\n")
url = "http://jandan.net/ooxx/"
totalPageNum = int(get_page(url))
beginPage = int(input("总页数为%d页,请输入开始下载图片的页数:\n" % totalPageNum))
endPage = int(input("总页数为%d页,请输入结束下载图片的页数:\n" % totalPageNum))
download_pics(folder, beginPage, endPage);
对比java爬虫,python果然简单不少,爬起来简单多了,运行这段代码需要安装些插件,出了问题直接百度就行了,然后按照要求,一般pip安装下就行了。