智一面的面试题提供python的测试题
使用地址:http://www.gtalent.cn/exam/interview?token=52cf92de494f4a8b6165d817a7279966

代码环境:
    操作系统:ubuntu 16
    python版本:3.5.2
    适用的爬取网站:笔趣阁
今天上笔趣阁看了看,想找个小说,记得以前好像是有完本txt下载的。但是看了两个好像都没有提供下载,只能在线读了
所以写了个小爬虫。去爬取一下笔趣阁的小说,然后自动按书名生成对应的txt文件。并没有太大的实用价值,毕竟现在流量
便宜了,大家看个在线小说的流量还是有的。
用法:
如图片显示,先在笔趣阁找到一个感兴趣的小说,打开后如图所示,会在当前页面显示小说所有的章节信息。点击对应的链接
跳到指定的章节。
此爬虫原理就是循环获取章节的url地址,拼接读取小说内容,写入文件。
程序接收两个命令行参数,第一个参数为某本小说的url地址。例如截图中的《巅峰文明》的地址为:http://www.biquge.com.tw/19_19001/
则使用命令:python xxx.py http://www.biquge.com.tw/19_19001/ /home/xxx/xiaoshuo/
其中/home/xxx/xiaoshuo/为生成的txt文件保存的目录。此处只写目录即可,文件名默认使用小说名字。
爬取过程如下:
等待全部爬取完毕,打开生成的txt文件即可。
代码如下:
  1. #coding=utf-8
  2.  
  3. import requests
  4. import sys
  5. import bs4
  6.  
  7. if len(sys.argv) < 3:
  8.     print("please enter the url, example: python3 test1.py http://xxx.xxx")
  9.     sys.exit()
  10. #某本书的url地址
  11. url = sys.argv[1]
  12. #生成的文件文件保存的位置
  13. directory = sys.argv[2]
  14.  
  15. print('start spider...')
  16. #基础url地址,用作地址拼接,自动爬取所有章节的小说
  17. baseurl = "http://www.biquge.com.tw"
  18. res = requests.get(url)
  19. res.raise_for_status()
  20. soup = bs4.BeautifulSoup(res.text, 'lxml')
  21. #获取书名
  22. bookname = soup.select('#info > h1')[0].getText()
  23. #解析html结构,dl下边有N个dd,dd中的a标签的href属性保存了对应章节的具体url地址
  24. chapters = soup.select('#list > dl > dd')
  25. print(len(chapters))
  26. for chapter in chapters:
  27.     atag = chapter.select('a')[0]
  28.     chapter_url = atag.get('href')
  29.     #拼接完整的url地址逐个去爬取数据
  30.     full_url = baseurl + chapter_url
  31.     article_res = requests.get(full_url)
  32.     article_soup = bs4.BeautifulSoup(article_res.text, 'lxml')
  33.     #查找小说内容的标签,小说内容存在id为content的div中
  34.     article_content = article_soup.select('#content')[0]
  35.     #查找小说的章节标题
  36.     article_title = article_soup.select('.bookname > h1')[0]
  37.     print('爬取:' + article_title.getText().encode('iso-8859-1').decode('gbk') + ' 的内容中...')
  38.     #以\r\n为标示分割一篇文章,将一章的小说内容分割为一个列表
  39.     lines = article_content.getText().split('\r\n')
  40.     print('爬取章节完成,开始写入文件...')
  41.     myfile = open(directory + "/" + bookname.encode('iso-8859-1').decode('gbk') + ".txt", 'a', encoding='iso-8859-1')
  42.     myfile.write(article_title.getText() + '\n')
  43.     for line in lines:
  44.         myfile.write(line.strip() + '\n')
  45.     myfile.write('\n\n\n')
  46.     print('章节写入文件完毕!')
  47. myfile.close()
复制代码

 
 

我们的python技术交流群:941108876
智一面的面试题提供python的测试题
使用地址:http://www.gtalent.cn/exam/interview?token=9d06e75d818c9506d4309684d9637395