好长时间没有使用自己蹩脚的技术写个小爬虫做点事情了,刚好,发现一个小说网站,当然,我对小说内容没有兴趣,只是随便找了本小说,爬爬测试。
下面是我的爬虫逻辑,首先,从目录页获得每个章的地址,这个在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]