Python爬虫,Json数据解析图片多线程爬虫

Python爬虫,Json数据解析图片多线程爬虫

失踪人口回归系列,新的一年,各位大佬哥如何了,新年好!

搬砖许久,很久没写爬虫了,瞎写的,随便看看就好!

目标网站.png

目标网址:https://award.kidp.or.kr/Exhibit/winners.do?cd_gubun=1&awards_cate1=1

通过浏览器抓包获取真实网址及数据,很明显,这是一个POST请求方式获取的json数据,我们可以使用python requests 模拟 post 请求方式获取数据,关键在于协议头和提交的数据!

通过浏览器抓包获取POST网址及数据!.png

几个关键点:

  1. requests.psot 模拟请求访问及解析json数据

这里关键在于协议头及请求数据的提交,其他直接调用就可以了!

参考源码

response=requests.post(url=url,data=data,headers=headers,timeout=10)
json_data =response.json()
print(json_data)
  1. 获取图片数据及过滤None

图片数据共有六个,由于图片数据存在数量差异,存在缺失图片的情况,比如三张、四张、五张,缺失的数据为None值,直接过滤处理掉多余的None!

参考源码

img1=row['img_physical_main']
img2=row['img_physical_sub1']
img3 = row['img_physical_sub2']
img4 = row['img_physical_sub3']
img5 = row['img_physical_sub4']
img6 = row['img_physical_sub5']
imgs=[img1,img2,img3,img4,img5,img6]
print(imgs)
#列表去除None
# 第一种:
# while None in imgs:
#     imgs.remove(None)
# 第二种:
imgs = [i for i in imgs if i != None]
print(imgs)
  1. 多线程下载图片数据

简单的应用多线程下载图片,可供参考!

参考源码

  def get_imgs(self,path,imgs):
      threadings=[]
      for img in imgs:
          t=threading.Thread(target=self.get_img,args=(img,path))
          threadings.append(t)
          t.start()

      for x in threadings:
          x.join()

      print(f"多线程下载图片完成")
  1. 四次重试下载图片

由于外网及网络的不稳定性,如果想要图片数据不缺失,还是建议上重试机制,一个典型的重试请求下载的demo,仅供参考!

参考源码

  # 4次重试
  def get_response(self, url, headers):
      i = 0
      while i < 4:
          try:
              response = requests.get(url, headers=headers, timeout=8)
              return response
          except requests.exceptions.RequestException:
              i += 1
              print(f">> 获取网页出错,6S后将重试获取第:{i} 次")
              time.sleep(6)
  1. 数据写入 excel 文件

将爬取到的数据写入到 excel文件 中!

参考源码:

import xlsxwriter

  #写入excel文件
  def write_to_xlsx(self):
      print(f'准备写入 {self.year} excel文件..')
      workbook = xlsxwriter.Workbook('{}.xlsx'.format(self.year))  # 创建一个Excel文件
      worksheet = workbook.add_worksheet(f'{self.year}')
      title = ['链接id''年份''分类''奖项''标题','产品特点1','产品特点2','图片']  # 表格title
      worksheet.write_row('A1', title)
      for index, data in enumerate(self.data_list):
          # content = content.rstrip()
          # keyword, rank, include_num, chart_url, title, game_id, company_num, long_words_num = data
          num0 = str(index + 2)
          row = 'A' + num0
          # data = [name, size, game_id]
          print(data)
          worksheet.write_row(row, data)
      workbook.close()
      print(f'写入 {self.year} excel文件成功!')

需要注意的是,worksheet = workbook.add_worksheet(f'{self.year}') 这里表名插入的数据是字符串而非整型,这个报错排查了许久,手疏了...

运行效果

运行爬取效果

完整demo获取

请关注本渣渣公众号:二爷记

pic_002.jpg

后台回复关键词:20220222

获取完整爬虫源码