python3通过flickr id来爬取每个id下照片总数

使用python3+requests+beautifulsoup4+openpyxl


因为在网上做了一个兼职,是他们给我flickr的ID,通过这些id来找需要的照片。有时候有的ID下照片太少,所以这有的ID不需要。写这个小程序就是为了过滤掉照片数太少的。

1.首先通过openpyxl把数据读取出来,保存在一个列表中。
创建一个Excel类,里面有读取Excel数据的函数(readExcel)和把数据写入Excel表中的函数(writeExcel)
代码:

'''
Created on 2017年9月3日

@author: liutao
'''
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl.writer.excel import ExcelWriter 
import os

class excel():



    def __init__(self, fil_address):
        self.file_address = fil_address

    #读取Excel表数据    
    def readExcel(self):
        """在Excel中读取数据 """
        data = []
        wb = load_workbook(self.file_address)
        sheet = wb.active
        for i in range(1, sheet.max_row+1):
            data.append(sheet.cell(row=i, column=1).value)
        wb.close()
        return data


    #写入Excel数据
    def writeExcel(self, lists):
        """把数据写入到excel中"""
        wb = Workbook()
        ws = wb.active
        #去除文件扩展名
        file_name = os.path.splitext(str(self.file_address))[0]+str('(1)')+str('.xlsx')
        print(file_name)
        print(lists)
        for i in range(0, len(lists)):
            ws.append(lists[i])
        wb.save(file_name)

然后就是爬虫,爬虫是用第三方库requests写的,我觉得这个比自带的urllib简单多了,很方便。不过就是速度不怎么快,或许是我用的ssr,网速太慢了吧。

爬虫我还没有采用类的方式来写,因为后期还需要修改,现在只是边写边测试。写的不好,见谅~

爬虫代码

'''
Created on 2017年9月3日

@author: liutao
'''
# /bin/bash

from Excel import excel
import requests
from bs4 import BeautifulSoup

file = "刘涛5.xlsx"
ex = excel(file)
ids = ex.readExcel()

#开始爬取网站用户图片总量
nums_data = []  #存储对应的照片数量
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
    ,'accept-language': 'zh-CN,zh;q=0.8'
    ,'accept-encoding': 'gzip, deflate, br'
    }

for i in range(0, len(ids)):
    url = r'https://www.flickr.com/photos/'+ids[i]
    print(str(i)+':'+url)
    try:
        r = requests.get(url, timeout=15, headers=headers)
    except requests.RequestException as e:
        print(e)
        #如果发生异常,设置照片数为0 
        nums_data.append([ids[i],0])
    except requests.ReadTimeout as t:
        print(t+'连接超时。。')
        nums_data.append([ids[i],0])
    else:    
        html = r.text
        #提取返回数据中的照片数
        soup = BeautifulSoup(html,"html.parser")
        tags = soup.find('p',attrs={'class':'metadata-item photo-count'})
        num = tags.string
        nums_data.append([ids[i],num])


ex.writeExcel(nums_data)

我实在windows环境下写的,还没在linux下去测试。windows下目录不怎么好使。

技术太渣了,还需努力啊

使用前:python3通过flickr id来爬取每个id下照片总数_第1张图片

使用后,会生成一个新文件,如之前有个文件为 刘涛.xlsx 爬取之后会在同目录生成一个 刘涛(1).xlsx
python3通过flickr id来爬取每个id下照片总数_第2张图片

后期我想还会加入多线程(加速爬取速度),ip代理(防封ip)。看能不能用web的方式来提供这个服务。

你可能感兴趣的:(python爬虫)