首页 > 其他分享 >一个简单的网络爬虫教程

一个简单的网络爬虫教程

时间:2022-11-15 11:32:01浏览次数:37  
标签:__ 教程 track self 爬虫 网络 queue url luoo

初入爬虫行业的程序员,往往会因为爬虫代码一个字符错误导致程序不能正常运行而且检查起来繁琐,耗费大量的精力,前期学习可以借鉴同行的代码加以完善,后期等技术能力达到一定的标准再去自己优化编写代码。下文就是通过编程语言的一个爬虫程序,希望大家有一些帮助。

分析爬虫目标结构

这里我们通过分析一个网站对网站内容进行提取来进一步了解!

第一步 确定目的

抓取目标网站的某一期所有音乐

第二步 分析页面结构

访问落网的某一期刊,通过Chrome的开发者模式查看播放列表中的歌曲,右侧用红色框线圈出来的是一些需要特别注意的语义结构,见下图所示:

以上红色框线圈出的地方主要有歌曲名称,歌曲的编号等,这里并没有看到歌曲的实际文件地址,所以我们继续查看,点击某一个歌曲就会立即在浏览器中播放,这时我们可以看到在Chrome的开发者模式的Network中看到实际请求的播放文件,如下图所示:

根据以上分析我们可以得到播放清单的位置和音乐文件的路径,接下来我们通过Python来实现这个目的。

实现爬虫

Python环境安装请自行Google

主要依赖第三方库

Requests(http://www.python-requests.org) 用来发起请求
BeautifulSoup(bs4) 用来解析HTML结构并提取内容
faker(http://fake-factory.readthedocs.io/en/stable/)用来模拟请求UA(User-Agent)

主要思路是分成两部分,第一部分用来发起请求分析出播放列表然后丢到队列中,第二部分在队列中逐条下载文件到本地,一般分析列表速度更快,下载速度比较慢可以借助多线程同时进行下载。
主要代码如下:

#-*- coding: utf-8 -*-
'''by sudo rm -rf http://imchenkun.com'''
import os
import requests
from bs4 import BeautifulSoup
import random
from faker import Factory
import Queue
import threading

fake = Factory.create()
luoo_site = 'http://www.luoo.net/music/'
luoo_site_mp3 = 'http://luoo-mp3.kssws.ks-cdn.com/low/luoo/radio%s/%s.mp3'

proxy_ips = [ '27.15.236.236' ] # 替换自己的代理IP
headers = {
'Connection': 'keep-alive',
'User-Agent': fake.user_agent()
}

def random_proxies():
ip_index = random.randint(0, len(proxy_ips)-1)
res = { 'http': proxy_ips[ip_index] }
return res

def fix_characters(s):
for c in ['<', '>', ':', '"', '/', '\\\\', '|', '?', '*']:
s = s.replace(c, '')
return s


class LuooSpider(threading.Thread):
def __init__(self, url, vols, queue=None):
threading.Thread.__init__(self)
print '[luoo spider]'
print '=' * 20
self.url = url
self.queue = queue
self.vol = '1'
self.vols = vols

def run(self):
for vol in self.vols:
self.spider(vol)
print '\\ncrawl end\\n\\n'
def spider(self, vol):
url = luoo_site + vol
print 'crawling: ' + url + '\\n'
res = requests.get(url, proxies=random_proxies())
soup = BeautifulSoup(res.content, 'html.parser')
title = soup.find('span', attrs={'class': 'vol-title'}).text
cover = soup.find('img', attrs={'class': 'vol-cover'})['src']
desc = soup.find('div', attrs={'class': 'vol-desc'})
track_names = soup.find_all('a', attrs={'class': 'trackname'})
track_count = len(track_names)
tracks = []
for track in track_names:
_id = str(int(track.text[:2])) if (int(vol) < 12) else track.text[:2] # 12期前的音乐编号1~9是1位(如:1~9),之后的都是2位 1~9会在左边垫0(如:01~09)
_name = fix_characters(track.text[4:])
tracks.append({'id': _id, 'name': _name})
phases = {
'phase': vol, # 期刊编号
'title': title, # 期刊标题
'cover': cover, # 期刊封面
'desc': desc, # 期刊描述
'track_count': track_count, # 节目数
'tracks': tracks # 节目清单(节目编号,节目名称)
}
self.queue.put(phases)


class LuooDownloader(threading.Thread):
def __init__(self, url, dist, queue=None):
threading.Thread.__init__(self)
self.url = url
self.queue = queue
self.dist = dist
self.__counter = 0

def run(self):
while True:
if self.queue.qsize() <= 0:
pass
else:
phases = self.queue.get()
self.download(phases)

def download(self, phases):
for track in phases['tracks']:
file_url = self.url % (phases['phase'], track['id'])

local_file_dict = '%s/%s' % (self.dist, phases['phase'])
if not os.path.exists(local_file_dict):
os.makedirs(local_file_dict)

local_file = '%s/%s.%s.mp3' % (local_file_dict, track['id'], track['name'])
if not os.path.isfile(local_file):
print 'downloading: ' + track['name']
res = requests.get(file_url, proxies=random_proxies(), headers=headers)
with open(local_file, 'wb') as f:
f.write(res.content)
f.close()
print 'done.\\n'
else:
print 'break: ' + track['name']


if __name__ == '__main__':
spider_queue = Queue.Queue()

luoo = LuooSpider(luoo_site, vols=['680', '721', '725', '720'],queue=spider_queue)
luoo.setDaemon(True)
luoo.start()

downloader_count = 5
for i in range(downloader_count):
luoo_download = LuooDownloader(luoo_site_mp3, 'D:/luoo', queue=spider_queue)
luoo_download.setDaemon(True)
luoo_download.start()

标签:__,教程,track,self,爬虫,网络,queue,url,luoo
From: https://blog.51cto.com/u_13488918/5852052

相关文章

  • 判断网络是否因果(causal)
    importnumpyasnpx=torch.randn(1,4,257,251)#[B,C,F,T]x[:,:,:,-1:]=np.infencoder=Encoder_Block().eval()withtorch.no_grad():R1,R2,R......
  • 网络
    URI统一资源标识符UniformResourceIdentifier唯一作用:解析标识符,可以将标识符分解成各种不同的组成成分非URL的其他URI统称为URN(统一资源名称)URL统一资源定位......
  • ASP.NET Core教程-Configuration(配置)-预定义中间件-静态文件支持
    更新记录转载请注明出处:2022年11月15日发布。2022年11月12日从笔记迁移到博客。基本使用使用UseStaticFiles()中间件即可支持静态文件,然后将静态文件放在根目录......
  • 学生网络创业交流会-2021年office
    1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分。  2.这一步非常的简单,打开下载素材......
  • H3C网络设备模拟器官方免费下载
    http://www.h3c.com/cn/Service/Document_Software/Software_Download/Other_Product/H3C_Cloud_Lab/Catalog/HCL/......
  • 网络请求
    flyio导入varFly=require('./lib/fly/wx.js');声明varfly=newFly;enum/**HTTP链接状态*/constHTTP_STATUS={SUCCESS:200,//成功}拦截器......
  • 13-1 k8s网络插件CNI
    k8s网络插件CNICNI:ContainerNetworkInterface:最主要功能就是实现Pod资源能够跨宿主机进行通信Flannel:最成熟、最简单的选择Calico:性能好、灵活性最强,目前的企业......
  • 13-3 k8s网络插件-flannel安装
    flannel安装:1、yaml方式安装:在已经安装好k8s集群之上部署flannel:获取flannelyaml文件,应用官方的yaml文件:若以下无法下载:https://kubernetes.io/docs/concepts/cl......
  • 13-2 k8s网络插件-flannel介绍
    Flannelflannel模型:host-gw模型VxLAN模型Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器......
  • windwos cmake与c++的使用教程
    1概述欢迎指正......