为了完成期末作业打算去爬一下漫画台这个网站
http://www.manhuatai.com/zhiyinmanke.html
一个挺不错的网站
目标是爬取漫画台主要模块版块的漫画名称
然后输入漫画名称来查看漫画章节
首先使用的是python3
from bs4 import BeautifulSoup as bs
from urllib import request
来介绍一下beautifulsoup 库包
eautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
来介绍一下urllib 库包
使用urllib库包中的request模拟浏览器发送请求
开始吧
导入库包
from bs4 import BeautifulSoup as bs
from urllib import request
from bs4 import BeautifulSoup as bs #将导入的模块命名为bs方便后面使用
模拟浏览器发送请求
def get_url(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
request1 = request.Request(url, headers=headers)
respond=request.urlopen(request1)
html=respond.read().decode('utf-8')
return html
设置头部信息让模拟更加真实
扫描二维码关注公众号,回复:
4835925 查看本文章
查看浏览器hearer信息
谷歌浏览器右键 ->检查->
request.Request(url,header=)
第一个参数是网站地址 第二参数传入一个字典
返回一个request对象
respond=request.urlopen(request1)
使用返回request对象的urlopen()方法发送请求
得到返回的网页代码可以使用
print(request.urlopen())打印网页代码
查看网页的编码方式
html=respond.read().decode('utf-8')
return html
此网页是使用utf-8的编码
使用decode('utf-8')
解码 变成unicode编码
并返回网页代码
第二步 将网页代码使用beautifulsoup 解析网页代码
将网页代码通过标签的层级关系解析成树形结构方便搜索
def parser_html(html):
#print(html)
soup=bs(html,'html.parser')#创建beautisoup对象,
ul_list=soup.find_all('a',class_='sdiv')
page_dic={'':''}#保存链接与漫画名称
for i in ul_list:
print(i['href'],i['title'])
page_dic[str(i['href'])]=i['title']
for k,v in page_dic.items():
print(k,v)
return page_dic
首先创建beautifulsoup对象
有两个参数第一个参数是网页代码,第二个是解析模式
返回对象
通过使用对象的fina_all()方法,会返回一个resultset集合元素为tag对象
查看网页代码发现:
数据是这样隐藏在这里的 a标签 class名称为sdiv中
于是便使用find_all(a,class="sdiv" 寻找标签
保存在page_dic 这个字典中链接作为键,名称作为值
使用循环输出数据
第三步通过输入的名称组合成新的url地址
def href_comb(page_dic):
href='http://www.manhuatai.com'
name=input('请输入漫画名')
for k,v in page_dic.items():
if(name==v):
print(name)
href1=k
return href+href1
有没有发现什么规律?
我们就只需将我们的字典中的‘键’组合进去再发送请求就可以获得网页代码了
第四步 再次向服务器发送请求
href=href_comb(page_dic)
print(href)
topic_html=get_url(href)
第五步 再次进行解析
def search_top(html):
s=bs(html,'html.parser')
topic1=s.find_all('ul',id='topic1')
#print(len(topic1))
topic1_a=topic1[0].find_all('a')
for i_a in topic1_a:
print(i_a.string)
先找到ul id 名称的标签,然后再寻找a标签
并打印
任务完成
附上全部代码
from bs4 import BeautifulSoup as bs
from urllib import request
import urllib
from selenium import webdriver
import time
from selenium.webdriver.support.ui import Select
def get_url(url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
request1 = request.Request(url, headers=headers)
respond=request.urlopen(request1)
html=respond.read().decode('utf-8')
return html
def parser_html(html):
#print(html)
soup=bs(html,'html.parser')#创建beautisoup对象,
ul_list=soup.find_all('a',class_='sdiv')
print(type(ul_list))
page_dic={'':''}#保存链接与漫画名称
for i in ul_list:
print(i['href'],i['title'])
page_dic[str(i['href'])]=i['title']
for k,v in page_dic.items():
print(k,v)
return page_dic
'''
取出网站,进行拼接
'''
def href_comb(page_dic):
href='http://www.manhuatai.com'
while 1:
try:
name=input('请输入漫画名')
for k,v in page_dic.items():
if(name==v):
print(name)
href1=k
return href+href1
except Exception as e:
print("输入不规范,请重新输入")
'''
寻找章节
'''
def search_top(html):
s=bs(html,'html.parser')
topic1=s.find_all('ul',id='topic1')
print(len(topic1))
topic1_a=topic1[0].find_all('a')
for i_a in topic1_a:
print(i_a.string,i_a['href'])
while 1:
try:
srting_top=input("请输入需要查看的章节")
for i_a in topic1_a:
if srting_top==i_a.string:
return 'http://www.manhuatai.com'+i_a['href']
except Exception as e:
print("输入错误,请再次输入需要查看的章节")
'''
寻找图片链接
'''
if __name__ == '__main__':
while 1:
html=get_url('http://www.manhuatai.com/zhiyinmanke.html')
page_dic=parser_html(html)
href=href_comb(page_dic)
print(href)
topic_html=get_url(href)
topic_href=search_top(topic_html)
print(topic_href)
get_pict_src(topic_href)
#save_picture(get_pict_src(topic_href))
targer=input("是否退出,退出请输入1,继续查看请输入2")
if targer==1:
break
#