好长时间没有使用自己蹩脚的技术写个小爬虫做点事情了,刚好,发现一个小说网站,当然,我对小说内容没有兴趣,只是随便找了本小说,爬爬测试。
下面是我的爬虫逻辑,首先,从目录页获得每个章的地址,这个在http://www.jmrgs.com/showinfo-121-65372-0.html#001这个网页上,可以通过beautifulsoup解析网页中的//*[@id=”17k_page_1_play”]/ul来获得,我是用了笨法,把这个网页源中的一部分复制下来,用文本编辑器去掉了无关字符来获得的。我觉得速度还可以,毕竟同样是批处理。
第二步是网址的合成,上一步得到的网址只有这个网站域名的后半部分,于是用连接字符串的方法,合成一个完整的网址。最后一步就是攫取内容,从网页获得内容,解析成文字,然后判断是不是最后一页(通过a.next),最后是循环爬取内容。为了防止被封,我设置了每隔2s爬取一次,但是在2600多秒还是被禁了,估计是还是识别了异常访问,没有作浏览器伪装。最后内容的获取其实写入文件更简单,但是会编码报错,于是打印出来再复制到文件的。其实,如果去掉那些字符,应该也不会报错了。
https://raw.githubusercontent.com/zd200572/craw-python/master/craw_xiaoshuo.py
附上我的原代码:
import requests import os import time from bs4 import BeautifulSoup import lxml import re import io import sys #import json #sys.getdefaultencoding('utf8') #url = 'http://www.jmrgs.com/showinfo-121-65372-0.html#001' #url1 = 'http://www.jmrgs.com/showinfo-116-616650-0.html' fout = open('tongchuangjiaoqi.txt', 'w') url_li = [] ''' content = requests.get(url).text soup = BeautifulSoup(content,'lxml') print(content) ''' def get_chapter_url(): with open('xiaoshuo.txt') as f: for line in f: url_li.append(line.strip().split('" title=')[0].split('<a href="')[-1]) #print(url_li[:10]) return url_li def get_page_url(a,i): #print(a) if i == 0: url = 'http://www.jmrgs.com' + a else: url = 'http://www.jmrgs.com' + a.split('0.html')[0] + '%s.html' % i #print(url) return url def get_chapter_content(url_li): for a in url_li: flag = 1 #print(a) i = 0 while flag == 1 and i <=6: url = get_page_url(a,i) content = requests.get(url) #content.encoding = 'utf-8' soup = BeautifulSoup(content.text,'lxml') #print(soup) s = str(soup.select('div#view_content_txt')) s_c = s.encode('latin-1').decode('unicode_escape') #print(soup.select('div.view_page')) if soup.select('a#next'): flag = 0 #print(soup.select('div.view_page')) print(s_c) time.sleep(2) else: i += 1 print(s_c) time.sleep(2) #break #continue #break #time.sleep(6) #i += 1 #print(soup) #print(soup.select('div#view_content_txt')) # #r1 = re.compile(r'') #con = r1.findall(content) #print(con) # break url_li = get_chapter_url() #url_li = ['/showinfo-116-616705-6.html'] get_chapter_content(url_li) fout.close() #[Finished in 2876.4s with exit code 1]