小说爬虫小试

好长时间没有使用自己蹩脚的技术写个小爬虫做点事情了,刚好,发现一个小说网站,当然,我对小说内容没有兴趣,只是随便找了本小说,爬爬测试。

下面是我的爬虫逻辑,首先,从目录页获得每个章的地址,这个在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]

 

发帖时间: IT 归档位置:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注