Python爬虫初步个人学习及心得

阅读: 评论:0

Python爬⾍初步个⼈学习及⼼得
⾃从毕设开始搞了Python之后就觉得这个东西值得研究。
但是毕设的东西⾮常的浅显,个⼈觉得最值得训练的还是Python的爬⾍,谨以此开篇,作为学习和练习Python的起步。
——————————学习分割线————————————
第⼀次学习的是Python爬取图⽚信息。
⽹上有很多很多关于这⼀类东西的教程,我也仅仅是可以实现,并且停留在⼀知半解的程度,在代码过程中添加了很多对Python的新的理解,对编程这个⼤集合的更深层的理解。张飞跃种子
⽹上的任何东西都可以看成资源,⼀个⽹站可能就是⼀段html+css,⼀张图⽚可能就是某个地址下的XXX.jpg⽂件,⽆数的⽹络资源存放在互联⽹上,⼈们通过地址(URL,统⼀资源定位符)来访问这些资源,⼤致过程如下:
⽤户在浏览器中输⼊访问地址,浏览器向服务器发送HTTP(或者HTTPS)请求(其中请求资源常⽤get请求,提交数据常⽤post请
求,post也可做数据请求)。服务器接收到了这些请求之后到对应的资源返回给浏览器,再经过浏览器的解析,最终呈现在⽤户⾯前。
莫扎特k310
这就是⽤户上⽹的⼀个简单的过程。那么,如果我们需要⼤量的从⽹上请求数据,依靠⼈⼯⼀个个得机械操作显然是不现实的,这时候爬⾍就起作⽤了。
⼀开始先要搞清楚什么是爬⾍。
其实本质上来说爬⾍就是⼀段程序代码。任何程序语⾔都可以做爬⾍,只是繁简程度不同⽽已。从定义上来说,爬⾍就是模拟⽤户⾃动浏览并且保存⽹络数据的程序,当然,⼤部分的爬⾍都是爬取⽹页信息(⽂本,图⽚,媒体流)。但是⼈家维护⽹站的⼈也不是傻的,⼤量的⽤户访问请求可以视为对服务器的攻击,这时候就要采取⼀些反爬机制来及时阻⽌⼈们的不知道是善意的还是恶意的⼤量访问请求(当然了= =不这样⼈家服务器吃枣爆炸)。
⽹站爬取过程中我们会碰到以下⼏种情况:
1.直接加载资源⽆处理
2.使⽤ajax异步加载
3.带参数验证的加载
5.登录验证
6.js加密
第⼀种⽆需解释,第⼆种是⽤户访问过程中异步向服务器发送请求会给筛选爬取数据增加难度,第三种是参数验证例例如时间戳,ip等,第四种是追踪验证⽤户的本地数据,第五种是⾝份验证,第六种是加载后对数据进⾏加密操作增加爬取难度。
本次学习只处理到第三层,带参数验证的⽹站加载。
先对这个⽹站进⾏分析。⼤部分都是套图,有⼀张图作为封⾯,并且,点击进⼊图⽚之后,有⼀个显⽰第⼀张图⽚的链接。
那么我们第⼀步可以在主界⾯的html代码中抽取出这些套图起始的链接地址,这⾥显然需要⽤到正则来提取这些不同地址。
那么,有了每个套图的起始地址之后,我们进⼊到⼦页⾯,刷新⽹页,观察它的加载流程。
这⾥我们可以观察到,仅仅是⼀张图⽚的加载就进⾏了如此多的⼯作,这个⽹站相对来说还是很复杂的(以后会放上⼀些相对来说不复杂的⽹页对⽐⾮常明显)
这⾥我们点击XHR,会发现chrome⾃动为我们筛选出了⼀个XHR对象,这是其使⽤ajax技术的证明,点击之后我们发现⾥边带的json数据跟我们想要的套图信息其实是⼀致的
随意点开⼀个发现⾥边的信息都是键值对的形式存在着,这⾥我们发现source⼀栏,选定该地址新建标签访问
这就是这张图⽚在⽹络上的地址(URL,统⼀资源定位符)
⾄此分析全部结束。
我们需要理清楚我们到底要做什么。
1.抓取主页⾯HTML代码,筛选出所有的套图链接
2.从套图页⾯中获取json,从信息中获取该套图的全部URL
3.根据URL下载图⽚到本地
4.重复2,3
下⾯挂上⼀个学习使⽤的代码
import json
import os
import re
import time
import requests
import pymysql
def strip(path):
path = re.sub(r'[?\\*|"<>:/]', '', str(path))
return path
# 爬⾍类
class Spider:
#初始化函数
def __init__(self):
self.session = requests.session()
# 下载图⽚
def download(self, url):
try:
return (url)
except Exception as e:
print(e)
# 从start_url开始获取全部的套图⼊⼝,并逐个获取套图信息,最终保存图⽚
def run(self, start_url):
#获取全部的套图⼊⼝id
img_ids = _img_ids(start_url)
print(img_ids)
#并逐个获取套图信息,最终保存图⽚
for img_id in img_ids:
#获取套图json信息
img_item_info = _img_item_info(img_id)
纳米氧化铋print(img_item_info)
self.save_img(img_item_info)
#exit()#仅循环⼀次
# 下载html代码,并从中筛选出套图⼊⼝id,返回套图id列表
def get_img_ids(self, start_url):
response = self.download(start_url)
水泥电阻if response:
html =
#正则仍然有待学习
ids = re.findall(r'tu.duowan/gallery/(\d+).html', html)
return ids
# 为了拿到json数据,我们观察⽂件中存在两个数字,⼀个是套图⼊⼝id我们已知,另⼀个是时间戳,可以仿制    def get_img_item_info(self, img_id):
# tu.duowan/index.php?r=show/getByGallery/&gid=125658&_=1519643852451
img_item_url = "tu.duowan/index.php?r=show/getByGallery/&gid={}&_={}".format(img_id,
int(time.time() * 1000))
#下载后解析得到可⽤的json数据
response = self.download(img_item_url)
if response:
return json.)
# 套图信息持久化
def save_img(self,img_item_info):
#以套图标题创建⽂件夹保存套图
dir_name = img_item_info['gallery_title']
抽气机原理#字符串剪切去掉⽆法做⽂件夹的字符串
strip(dir_name)
print(dir_name)
#创建⽂件夹
if not ists(dir_name):
if not ists(dir_name):
os.makedirs(dir_name)
#获取图⽚名,图⽚url,图⽚后缀,保存图⽚路径等
for img_info in img_item_info['picInfo']:
img_name = img_info['title']
strip(img_name)
img_url = img_info['url']
pix = (img_url.split('/')[-1]).split('.')[-1]
img_path = os.path.join(dir_name, "{}.{}".format(img_name, pix))#此处路径拼接避免出现字符串问题
print(dir_name,img_name,img_path)
#保存图⽚⾄本地
if not ists(img_path):
response = self.download(img_url)
if response:
print(img_url)
img_data = t
with open(img_path, 'wb') as f:
f.write(img_data)
#在本地数据库中插⼊记录
db = t("localhost", "root", "123456", "python", use_unicode=True,
charset="utf8");  # 此处会出现编码问题
cursor = db.cursor()
try:
sql = "INSERT INTO img (dir_name,img_title,img_path) VALUE (%s,%s,%s);"  # 此处写法可以避免转义问题                ute(sql, (dir_name, img_name, img_path))
dbmit()
热流道技术
except Exception as e:
print(e)
db.close()
if __name__ == '__main__':
spider = Spider()
spider.run('tu.duowan/m/bizhi')
#spider.download('tu.duowan/gallery')
代码仅供学习参考使⽤,也是给⾃⼰起⼀个回顾的作⽤。
代码中仍然存在缺陷,例如数据库开关操作过多等,以后的优化后期再做处理。
时常提醒⾃⼰多多练习Python。

本文发布于:2023-08-16 08:10:44,感谢您对本站的认可!

本文链接:https://patent.en369.cn/xueshu/366370.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:套图   请求   代码   数据   资源   学习
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图