Python爬虫,g-mark网站图片数据爬取及补坑

应用python对g-mark网站图片数据爬取,同时但对于数据抓取失败的图片进行补坑(重新爬取操作),由于是日本网站,没有梯子访问的话,特别容易访问超时,比较合适的补坑操作是直接将数据采集到数据库,而本渣渣这里是采集保存到本地,所有,一些保存的数据需要二次格式化处理!

pic_001.png

爬取链接:https://www.g-mark.org/activity/2020/best100.html

第三方库:requests,fake_useragent,lxml

爬取关键点

1.requests访问超时重试的应用

访问超时重试,requests已经打包好,可以直接调用,很方便!

from requests.adapters import HTTPAdapter

s = requests.Session()
s.mount('http://', HTTPAdapter(max_retries=3))
s.mount('https://', HTTPAdapter(max_retries=3))

2.xpaht 关键节点获取数据

  • 链接节点
 urllists=req.xpath('//ul[@class="itemList listB2"]/li/a/@href')
  • 信息节点
basicinfos=req.xpath('//dl[@class="basicinfo"]//text()')

这里“//”,代表获取该节点元素下所有的数据内容!

  • 图片节点
photos=req.xpath('//ul[@class="photo"]/li/a/img/@src')

3.数据格式化处理

  • 网址拼接
parse_url='https://www.g-mark.org{}'.format(url)
  • 数据过滤,整理
for basicinfo in basicinfos:
    if basicinfo != '\r\n\t\t\t':
        information=f'{information}:{basicinfo}'

过滤空白字符,整合拼接需要的字符内容数据,想要更加精细化数据,建议一个节点一个节点获取内容!

  • 图片数据格式化处理
img_url=photo.split('?w')[0]
img_name=img_url[-24:]
print(img_url,img_name)

图片数据格式化,这里本渣渣指的是,图片链接及图片名的格式化处理,为下一步图片的下载及图片数据的保存做准备,这里需要结合实际情况进行处理,这里应用了切片处理及split函数!

4.访问超时出错的处理

访问超时出错,try-except,直接将出错的数据保存到本地txt中,方便数据补坑操作调用,这里没有保存到数据库,应该还是存储到数据库更加方便,大家看着操作吧!

  • 链接访问超时出错处理
try:
    self.parse(parse_url,x)
except Exception as e:
    print(f"访问页面出错,错误代码:{e}")
    with open(f'fail_url.txt','a+'as f:
        f.write(f'{parse_url}-{x}\n')
  • 图片下载超时出错处理
def dowm_img(img_url, img_name,x,y):
    try:
        r = self.s.get(img_url, headers=self.headers, timeout=10)
        with open(f'{x}_{y}_{img_name}''wb'as f:
            f.write(r.content)
        print(f"下载 {x}_{y}_{img_name} 图片成功")
    except Exception as e:
        print(f"下载图片出错,错误代码:{e}")
        with open(f'fail_img.txt''a+'as f:
            f.write(f'{img_url}-{x}_{y}_{img_name}\n')

5.数据补坑操作

出错数据记录,这里本渣渣用了“-”作为间隔存储数据,但是本身网站链接就有“-”字符,所以也算是自己给自己挖坑,在数据读取后,数据格式化处理费了点功夫,这类失误应该尽量避免!

  • 出错数据读取
path=r'b\fail_img.txt'
with open(path,'r'as f:
    img_datas=f.readlines()

print(len(img_datas))
  • 数据处理
img_data=img_data.split()[0]
img_url=f"{img_data.split('-')[0]}-{img_data.split('-')[1]}"
img_names=img_data.split('-')[2]
x=img_names.split("_")[0]
y=img_names.split("_")[1]
img_name=img_names[-24:]
print(img_url,img_name,x,y)
  • 函数调用

数据补坑,直接调用写好的类,初始化操作,直接调用相关的函数,爽歪歪!

from gm import Gmark
spider=Gmark() #初始化类
spider.dowm_img(img_url,img_name,x,y) #图片下载函数调用
spider.parse(url, x) #链接爬取函数调用

以上都是渣渣瞎bb,仅供参考!


完整源码获取,

关注本渣渣微信公众号:二爷记 

pic_004.jpg

后台回复:g-mark