声明:本次爬虫仅为个人练习,无任何获利行为。
目标网站:作文吧
目标链接:https://www.zuowen8.com
实现功能:通过多进程爬取各个年级的作文,并将各年级的文件夹保存在本地本年级文件夹下
练习目的:练习python爬虫之bs4、os创建文件夹、文件输出、多进程
最终实现截图:
![](https://img-blog.csdnimg.cn/238190c171ee4d16b93ff5f20e25dea8.png)
总结:
- 作文吧没有反爬机制,是作为练习爬虫的一个不错的网站,通过解析首页获取各个年级的作文页面,再通过各个年级的作文页面获取当前年级下每篇作文的页面,整个流程可以使用BeautifulSoup可以获取下一级的URL再进行解析;
-
工具函数level中,如果传入的参数为class 'bs4.element.Tag'类型的话会有“maximum recursion depth exceeded while getting the str of an object”错误,通过网上资料也不知道是什么原因,解决方法就是转换为str类型,再在level函数中通过bs4.BeautifulSoup再转换为class 'bs4.element.Tag'类型,再进行相应操作。如果有知道的朋友麻烦告知一下,让我学习学习!
-
创建文件或文件名时可能会有非法字符,可以通过通过正则匹配去掉非法字符
#h1为爬取下来的文件名 h1 = re.sub('[\/:*?"<>|]', '', str)
部分代码如下:
#解析每一篇作文页面
def parse_page(url, dir_file_one, dir_file_two):
soup = get_res_soup(url)
#使用正则去掉非法字符,避免创建文件出错
h1 = re.sub('[\/:*?"<>|]', '', soup.find('h1').text)
print(dir_file_one, '------>', dir_file_two, '------->', h1)
page_content = soup.find('div', class_ = 'content').text
filename = './' + dir_file_one + '/' + dir_file_two
if not os.path.exists(filename):
os.makedirs(filename)
with open(filename + '/' + h1 + '.txt', 'a', encoding = 'utf-8') as f:
f.write(h1)
f.write(page_content)
f.close()
def level(href, filename_one):
href_soup = bs4.BeautifulSoup(href, 'html.parser')
href_a = href_soup.find_all('a')
for i in range(len(href_a)):
url = url_q.format(href_a[i]['href'])
bj = href_a[i].text
parse_page_url(url, filename_one, bj)
main函数如下:
def main():
bj_href_list = parse_allpage(url_q.replace('{}', ''))
for bj_href in bj_href_list:
#如果传入的参数为class 'bs4.element.Tag'类型的话会报错,传入str类型就不会
t1 = multiprocessing.Process(target = level, args = (str(bj_href[0]), bj_href[1]))
t1.start()