嗯……之前用Scrapy写过一个,并且成功爬了下来,奈何效率低下而且配置蛋疼,今天在网易云课堂看到不错的教程,用他现成的代码改了下,竟也运行成功,而且效率高了不少。在此Mark下,方便以后参考。
因为论坛限制搜索时间在一年以内,为了方便本地查找资源,因此目标为保存所有的专辑及链接到一个HTML中。
思路很简单,首先打开网页,筛选需要抓取的数据(链接、标题),保存浏览器的Cookies及User-Agent到一个Dict里,用requests库加上之前的User-Agent下载网页,使用BeautifunSoup解析后,调试CSS Selector到能够准确指向所需信息,然后将专辑及对应的链接分别放置在一个Dict里,处理输出即可。
from bs4 import BeautifulSoup
import requests
import time
#定义需要爬取的页面及headers
url = 'https://hostname/bbs/thread.php?fid=fid&page=1'
urls = ['https://hostname/bbs/thread.php?fid=fid&page={}'.format(str(i)) for i in range(start,end,step)]
headers = {
'User-Agent':'',
'Cookie':''
}
#爬取专辑信息
def getAlbumInfo(url,data=None):
wb_data = requests.get(url,headers=headers)
time.sleep(4)
soup = BeautifulSoup(wb_data.text,'lxml')
titles = soup.select('tr.t_one > td > h3 > a')
links = soup.select('tr.t_one > td > h3 > a')
data = []
if data == []:
for titles,links in zip(titles,links):
datas = {
'title' :titles.get_text(),
'link' :links.get('href'),
}
data.append(datas)
print(data)
return data
#遍历爬取结果及输出为HTML链接
def dataProcessAndWriteToFile(result):
for links in result:
url = '<a '+'href=https://hostname/bbs/'+str(links['link'])+'>'+str(links['title'])+'</a>'+'</br>'
print(url)
f = open('output.html','a',encoding='utf-8')
f.write(url)
f.close()
#执行
for url in urls:
current = getAlbumInfo(url)
dataProcessAndWriteToFile(current)