700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用Python编写爬虫程序(代码详细注释) 获取彼岸图网的图片

使用Python编写爬虫程序(代码详细注释) 获取彼岸图网的图片

时间:2023-09-09 09:58:57

相关推荐

使用Python编写爬虫程序(代码详细注释) 获取彼岸图网的图片

文章目录

一、要求二、设计1、彼岸网站URL规则2、程序流程图 三、代码(详细注释)四、所遇到过的问题

一、要求

1、抓取目标

彼岸图网()上的4K图片。

2、抓取方式

基于Python的聚焦式网络爬虫爬取。

3、存储方式

本地文件存储。

4、工具

pycharm、Python、Firefox浏览器

二、设计

1、彼岸网站URL规则

(1)每个大分类的首页网址构成为/ + 分类名;

(2)每个大类的每一页一般为20个展示4K图片,每页的网址构成为/ + 分类名 + index_ + 页数 + .html ,其中第一页特殊,网址就是大类网址;

(3)单张图片的网页在标志为 id=“main” 下的第三个div下的每一个li下的a旁边的href="/tupian/27638.html",/ + 【href后面的网址】 就是单页网址

(4)在单页网址中,第一个 id=“img"下的img旁边的src=”/uploads/allimg/210624/082402-16244942421f54.jpg",/ + 【href后面的网址】就是图片URL。

2、程序流程图

三、代码(详细注释)

import requestsfrom lxml import etreeimport os# 从栏目页进入内容页并调用函数开始爬取图片def name(url, type_name, headers):url = url + page_list_url[int(type_name)]#int() 函数用于将一个字符串或数字转换为整型。分类首页网址doc_name = './' + page_list_name[int(type_name)].encode('ISO-8859-1').decode('gbk')page_list_text = requests.get(url=url, headers=headers).text#获取网页page_list_tree = etree.HTML(page_list_text)page_list_limit = page_list_tree.xpath('//*[@id="main"]/div[4]/a[7]/text()')[0]#读取总页数所有标签为id="main"的第四个div下的直系标签第7个a下的文本的第0个元素while True:print("{}上限页数为{}页".format(page_list_name[int(type_name)].encode('ISO-8859-1').decode('gbk'), page_list_limit))page_need = input("请输入您要爬取{}的页数: ".format(page_list_name[int(type_name)].encode('ISO-8859-1').decode('gbk')))if page_need.isdigit() and 1 <= int(page_need) <= int(page_list_limit): # 判断是否填写有误(包括页数判断)if not os.path.exists(doc_name):#判断括号里的文件是否存在os.mkdir(doc_name)#以数字权限模式创建目录for i in range(1, int(page_need) + 1):#range() 函数可创建一个整数列表if i == 1: # 第1页爬取crawler(page_list_tree, doc_name)else: # 第2页及以上爬取page_url = url + 'index_' + str(i) + '.html'page_list_text = requests.get(url=page_url, headers=headers).textpage_list_tree = etree.HTML(page_list_text)crawler(page_list_tree, doc_name)breakelse:print("\n输入错误!\n请重新输入正确的数字")# 封装内容页图片连接解析函数def crawler(page_list_tree, doc_name):img_list_url = page_list_tree.xpath('//*[@id="main"]/div[3]/ul/li/a/@href')#获取图片网页地址img_name = page_list_tree.xpath('//*[@id="main"]/div[3]/ul/li/a/b/text()')#名字地址for i in range(len(img_name)):img_url = '' + img_list_url[i]#单张图片网页name = img_name[i].encode('ISO-8859-1').decode('gbk') + '.jpg'#对应图片名字img_page = requests.get(url=img_url, headers=headers).textimg_page_tree = etree.HTML(img_page)page_img_src = img_page_tree.xpath('//*[@id="img"]/img/@src')[0]#定位page_img_src = '' + page_img_src#图片地址img = requests.get(url=page_img_src, headers=headers).contentimg_path = doc_name + '/' + namewith open(img_path, 'wb') as fp:#打开一个只写文件fp.write(img)print(name + '下载成功!!!')# 网站网址(彼岸)url = ''# herders请求字段,为的是模拟用户的请求headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4208.400'}#获取网页response = requests.get(url=url, headers=headers).text# 解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象tree = etree.HTML(response)# xpath可以用来在xml文档中对元素和属性进行遍历。page_list_url = tree.xpath('//*[@id="main"]/div[2]/a/@href')#获取URL找到所有标签为id="main"的第二个div下的直系标签a下的属性为href的page_list_name = tree.xpath('//*[@id="main"]/div[2]/a/text()')#获取名字while True:print("0.风景 \t1.美女 \t2.游戏\t 3.动漫 \t4.影视 \t5.明星\t 6.汽车 \t7.动物 \t8.人物 \t9.美食 \t10.宗教 \t11.背景")type_name = input("请输入对应数字: ")if type_name.isdigit() and 0 <= int(type_name) <= 11: #判断是否数字且是否超出可爬取范围name(url, type_name, headers)breakelse:print("\n输入错误!\n请重新输入正确的数字")continue

四、所遇到过的问题

问题一:

爬取的文字是乱码。

解决方法:

在查阅资料后,发现原因是网站的编码方式是gbk,而Requests遵循RFC标准,编码使用ISO-8859-1,所以在爬取网页的时候需要转换编码方式,使用命令.encode(‘ISO-8859-1’).decode(‘gbk’)。

问题二:

使用正则表达式筛选数据复杂。

解决办法:

选择xpath对数据进行筛选。XPath 可用来在 XML 文档中对元素和属性进行遍历。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。