主要目的练习爬虫BeautifulSoup requests 基本用法。同时一些小网页的文字总是注册后才让复制,好麻烦,所以干脆爬取试试。
申明:本文仅限于学习交流,不可以用于商业,爬取的数据请尽快删除
import requests
from bs4 import BeautifulSoup
import time
#url = 'http://www.ruiwen.com/pingyu/1293492.html' # 需要请求的网页的链接
#url ='http://www.zuowen.com/yanjianggao/gqx/index_'+'5'+'.shtml' # 需要请求的网页的链接
def jiexi(n): #解析产生第n页的所有文章地址
url ='http://www.zuowen.com/gaokaozw/manfen/index_'+str(n)+'.shtml' # 按照页码构造需要请求的网页的链接
html = requests.get(url) # get方式请求数据
# print(html.status_code) # 查看请求的状态码(200表示请求正常)
html.encoding = 'gbk'
content = html.text
# 下面解析你需要的内容
# 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
soup = BeautifulSoup(content, "lxml")
words=soup.find_all('div',class_="artbox_l_c")
#print(words)
global result
global drl
result = []
for div in words:
drl=div.find('a')
#print(type(drl))
result.append(drl['href'])
print(drl['href'])
def gaozi(idd):
url = idd # 用参数 传入需要请求的文字所在网页的链接
html = requests.get(url) # get方式请求数据
time.sleep(0.5)
# print(html.status_code) # 查看请求的状态码(200表示请求正常)
html.encoding = 'gbk'#解决中文可能会乱码的问题 有时候是utf-8
if html.status_code==200:
content = html.text
else:
html = requests.get(url)
time.sleep(2)
content = html.text
# 下面解析你需要的内容
# 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
soup = BeautifulSoup(content, "lxml")
words=soup.find_all('p')
titl=soup.find('h1')
result2= []
result2.append(titl.text)
for th in words[1:-10]:
result2.append(th.text)
#print(th.text)
with open('高考满分作文.txt','a',encoding='gbk') as f:
f.write('\n'+str(result2[:])+'\n')
f.close()
#print('')
def shouye(): #其实和gaozi(idd)函数一样,但是专门用来爬取第一页,因为第一页网址结构不太一样
global m
m=1
url ='http://www.zuowen.com/gaokaozw/manfen/index.shtml' # 按照页码构造需要请求的网页的链接
html = requests.get(url) # get方式请求数据
# print(html.status_code) # 查看请求的状态码(200表示请求正常)
html.encoding = 'gbk'
content = html.text
# 下面,解析你需要的内容
# 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
soup = BeautifulSoup(content, "lxml")
words=soup.find_all('div',class_="artbox_l_c")
#print(words)
global result , drl
result = []
for div in words:
drl=div.find('a')
#print(type(drl))
result.append(drl['href'])
print(drl['href'])
for i in result:
try:
gaozi(i)
print('写入第'+str(m)+'篇成功')
m+=1
except Exception as e:
print('第'+str(m)+'篇编码错误')
m+=1
shouye() #爬取第一页
for n in range(2,92): #爬取第2页以后所有的页面
jiexi(n)
for i in result:
try:
gaozi(i)
print('写入第'+str(m)+'篇成功')
m+=1
except Exception as e:
print('第'+str(m)+'篇编码错误')
m+=1
下面是改进的代码,通用性更强,可以爬取这个网站的各种资源,只需要改变idhead
例如:‘http://www.zuowen.com/yanjianggao/gqx/index_5+.shtml’
只需要取http://www.zuowen.com/yanjianggao/gqx/index_ 即可。后面输入该页面 下面总共可显示的页数,就能完成爬取。
这个页面比较简单,思路特别清晰,下一步可以试试利用Scrapy的框架取爬取提升速度,有兴趣的朋友可以改成这个框架的方法试试。
import requests
from bs4 import BeautifulSoup
import time
#url = 'http://www.ruiwen.com/pingyu/1293492.html' # 需要请求的网页的链接
#url ='http://www.zuowen.com/yanjianggao/gqx/index_'+'5'+'.shtml' # 需要请求的网页的链接
def jiexi(urlhead,n): #解析产生第n页的所有文章地址
if n==1:
url =urlhead[:-1] +'.shtml' # 按照页码构造需要请求的网页第一页的链接
else:
url =urlhead+str(n)+'.shtml' # 按照页码构造需要请求的网页的链接
html = requests.get(url) # get方式请求数据
# print(html.status_code) # 查看请求的状态码(200表示请求正常)
html.encoding = 'gbk'
content = html.text
# 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
soup = BeautifulSoup(content, "lxml")
words=soup.find_all('div',class_="artbox_l_c")
#print(words)
global result
global drl
result = []
for div in words:
drl=div.find('a')
#print(type(drl))
result.append(drl['href'])
print(drl['href'])
def gaozi(title,idd):#解析每一篇文章链接,获取文字写入txt的函数
url = idd # 用参数 传入需要请求的文字所在网页的链接
html = requests.get(url) # get方式请求数据
time.sleep(0.5)
# print(html.status_code) # 查看请求的状态码(200表示请求正常)
html.encoding = 'gbk'#解决中文可能会乱码的问题 有时候是utf-8
if html.status_code==200: #请求页面获取内容
content = html.text
else:
html = requests.get(url) #第一次失败后,再次请求,等待两秒,并且获取页面取内容
time.sleep(2)
content = html.text
# 解析器自带的是html.parser,也可以用lxml,兼容性更好,不过要单独安装第三方库
soup = BeautifulSoup(content, "lxml")
words=soup.find_all('p')
titl=soup.find('h1')
result2= []
result2.append(titl.text)
for th in words[1:-10]:
result2.append(th.text)
#print(th.text)
with open(title+'.txt','a',encoding='gbk') as f:
f.write('\n'+str(result2[:])+'\n')
f.close()
#print('')
def writer(peg):# 爬取 jiexi(idhead,n)函数产生的文章地址链接,写入txt文件
m=1
for n in range(1,int(peg)):# 手工设置爬取的页数
jiexi(idhead,n) #解析产生第n页的所有文章地址
for i in result:
try:
gaozi(title,i) #解析每一篇文章链接,获取文字写入txt的函数
print('写入第'+str(m)+'篇成功')
m+=1
except Exception as e:
print('第'+str(m)+'篇编码错误')
m+=1
if __name__ == '__main__':
idhead='http://www.zuowen.com/xiaoxue/yinianji/tonghuayuyan/index_'
title=input('先创建需要保存的文件名:')
pg=input('输入爬取的页数不要超过总页数:')
writer(pg)