shell脚本执行定时任务,每天定时批量执行多个pthon脚本爬取网站内容,提取出地址并转换为经纬度

由于有反爬机制,使用了自动化测试工具selenium的无头模式进行爬取,使用fake_useragent设置随机请求头。

爬虫难点:

  1. 有时候元素未显示在当前窗口,需要执行js进行滚动操作。滚动大小可以根据窗口(滚动指定窗口大小),也可以根据元素来(滚动到指定元素)。

    根据窗口:

    # 获取当前窗口的高度
    window_height = driver.execute_script("return window.innerHeight")
    # 执行JavaScript滚动操作
    driver.execute_script(f"window.scrollBy(0, {int(window_height / 2)})")

    根据元素:

    # 定位到需要滚动到的元素
    element_to_scroll_to = driver.find_element(By.XPATH, "//your/xpath/to/element")
    # 使用 JavaScript 滚动到指定元素
    driver.execute_script("arguments[0].scrollIntoView();", element_to_scroll_to)
  2. 网站元素为动态加载,需要用WebDriverWait设置等待指定元素加载

    # 设置一个等待时间,等待某个元素加载完成,可以根据实际情况调整
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, 'knowstart'))
    )
  3. click点击元素后,需要driver.window_handles获取所有窗口句柄后进行窗口的切换

    # 获取所有窗口句柄
    window_handles = driver.window_handles
    # 切换到最新打开的页面
    latest_window_handle = window_handles[-1]
    driver.switch_to.window(latest_window_handle)

过程中出现ip被封的情况。本来想通过proxypool爬虫代理池获取免费代理,后面调整爬取频率解决了这个问题。

对于有些反爬的网站,这种限制频率的方式是没用的。只要是同个ip在爬,速度够快,很快就会封掉。

这种情况还是需要走代理ip

shell脚本难点:

shell脚本实现多个python脚本爬取,根据脚本不同输出不同的日志到对应文件。并设置如果脚本执行失败自动再次重试,重试最大次数为3次。

定时任务难点:主要是一个cron表达式的理解,其他没有什么。

定时任务坑点:

定时任务的执行涉及shell脚本和python脚本的执行。

一定要保存好输出文件,将输出保存到log文件中,方便查找错误。

  1. crontab -e打开的文件,里面的内容需要使用全路径。或者使用cd /path(shell脚本调用的python脚本执行的路径,否则出现No such file or directory)

  2. 确保执行的文件有执行权限

    查看文件执行权限:

    ll filename

    添加权限

    chmod +x filename
  3. 确保启用了cron定时服务

    查看cron定时任务

    crontable -l

    修改cron定时任务

    crontable -e

    修改后会自动加载

查看定时任务是否执行:

tail -f /var/log/cron

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用Python的Pillow和ExifRead库来提取文件夹里所有照片的经纬度,并将其导到表格中。以下是一个示例代码: ```python import os import exifread from PIL import Image # 设置文件夹路径 folder_path = 'your_folder_path' # 创建一个空的列表来存储所有的照片信息 photo_info_list = [] # 遍历文件夹中的所有文件 for file_name in os.listdir(folder_path): # 只处理JPG和JPEG格式的文件 if file_name.endswith('.jpg') or file_name.endswith('.jpeg'): # 打开图片文件并获Exif信息 file_path = os.path.join(folder_path, file_name) with open(file_path, 'rb') as f: exif_tags = exifread.process_file(f) # 获经纬度信息 gps_latitude_ref = exif_tags.get('GPS GPSLatitudeRef') gps_latitude = exif_tags.get('GPS GPSLatitude') gps_longitude_ref = exif_tags.get('GPS GPSLongitudeRef') gps_longitude = exif_tags.get('GPS GPSLongitude') # 将经纬度信息转换为度数表示 if gps_latitude and gps_longitude: latitude = float(str(gps_latitude).replace('[','').replace(']','').replace(',','')) longitude = float(str(gps_longitude).replace('[','').replace(']','').replace(',','')) if gps_latitude_ref.values[0] == 'S': latitude = -latitude if gps_longitude_ref.values[0] == 'W': longitude = -longitude else: latitude = None longitude = None # 获其他信息 image = Image.open(file_path) width, height = image.size date_taken = exif_tags.get('EXIF DateTimeOriginal') camera_make = exif_tags.get('Image Make') camera_model = exif_tags.get('Image Model') # 将所有信息添加到列表中 photo_info_list.append({ 'File Name': file_name, 'Latitude': latitude, 'Longitude': longitude, 'Width': width, 'Height': height, 'Date Taken': date_taken, 'Camera Make': camera_make, 'Camera Model': camera_model }) # 将列表中的信息导到CSV文件中 import csv with open('photo_info.csv', 'w', newline='') as f: writer = csv.DictWriter(f, fieldnames=photo_info_list[0].keys()) writer.writeheader() for photo_info in photo_info_list: writer.writerow(photo_info) ``` 在这个示例代码中,我们首先遍历指定的文件夹中的所有文件,并只处理JPG和JPEG格式的文件。然后,我们打开每个文件并获其Exif信息,包括经纬度、图片尺寸、拍摄日期和相机型号等。接下来,我们将所有信息添加到一个列表中,并在最后将其导到CSV文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值