需求来源

朋友家物业需要收集小区人员的核酸证明图片,大致流程如下:

  1. 一个excel表格,里面存储的是人员的姓名和身份证号
  2. 在查询网站上输入人员的姓名及身份证号

image.png

  1. 进入报告总览界面,获取第一条核酸证明记录

image.png

  1. 下载里面的核酸证明

image.png

需求分析

  1. 读取excel,获取人员信息并转成数组
  2. 需要做一个类似登录的验证,获取cookie,后面携带cookie获取信息。
  3. 界面html解析,获取第一条a标签的地址
  4. 正则表达式,将查看的地址中的report转换为down即可生成图片资源的连接
    1. pandas.read_excel:解析excel
    2. urllib:网络请求
    3. http.cookiejar:存储cookie
    4. BeautifulSoup:解析html
    5. requests:获取链接中的图片资源

    读取excel

    ```python import pandas as pd

def get_excel_data():

  1. # 读取excel第2列和第3列的信息
  2. name_id = pd.read_excel("data.xlsx", usecols=[1, 2], header=0)
  3. # 将读取成功的信息转换为数组格式
  4. lists = name_id.values.tolist()
  5. result = []
  6. # 以姓名、id的对象形式存入结果集
  7. for person_list in lists:
  8. result.append({
  9. "name": person_list[0],
  10. "id": person_list[1]
  11. })
  12. return result
  1. <a name="frmPs"></a>
  2. ### 登录(验证)并存储cookie
  3. ```python
  4. import urllib.request
  5. import urllib.parse
  6. import http.cookiejar
  7. def login(name, idcard):
  8. form_data = {'IDCard': idcard, 'xm': name}
  9. # 将对象格式转换为urlencode格式
  10. postdata = urllib.parse.urlencode(form_data).encode()
  11. # 创建请求体
  12. request = urllib.request.Request('验证身份的api', postdata)
  13. # 发送请求
  14. response = opener.open(request)
  15. # 存储cookie
  16. for item in cookiejar:
  17. Cookie = '%s=%s' % (item.name, item.value)
  18. # 将cookie放入全局的请求头中
  19. headers['Cookie'] = Cookie

携带cookie访问报告总览界面

这一步主要进行两个操作:

  1. 获取界面html
  2. 解析界面html并找到第一个a标签中的href属性值
    1. def to_my_report():
    2. # 进入网页
    3. request = urllib.request.Request('界面的地址')
    4. # 获取网页源码
    5. response = opener.open(request)
    6. # 解析网页html
    7. soup = BeautifulSoup(response.read(), 'lxml')
    8. # 返回第一个a标前的href属性值
    9. return soup.a.attrs['href']

    下载图片链接中的图片资源

    ```python import requests

def get_photo(img_url, file_name):

  1. # 请求资源链接
  2. r = requests.get(img_url, headers=headers, stream=True)
  3. if r.status_code == 200:
  4. # 调用open将资源流存入文件夹
  5. with open('./photo/' + file_name + '.jpg', 'wb') as f:
  6. f.write(r.content)
  7. return True
  8. else:
  9. return False
  1. <a name="pjjdL"></a>
  2. ### 整合以上方法
  3. ```python
  4. if __name__ == '__main__':
  5. # 记录下载的结果
  6. count = 0
  7. count_fail = 0
  8. count_un_res = 0
  9. download_fail_person = []
  10. un_res_person = []
  11. # 获取人员信息数组
  12. person_list = get_excel_data()
  13. try:
  14. # 遍历人员信息
  15. for data in person_list:
  16. # 获取cookie
  17. login(data['name'], data['id'])
  18. # 拿到带guid的href链接
  19. href = to_my_report()
  20. print("正在下载{}".format(data))
  21. # 如果是javascript:void(0)则说明核酸结果未出
  22. if href == 'javascript:void(0)':
  23. count_un_res += 1
  24. un_res_person.append(data)
  25. else:
  26. # 若结果已出则将链接中的report通过replace换为down(即图片资源链接)
  27. if get_photo(base_url + href.replace('report', 'down'), data['name']):
  28. count += 1
  29. else:
  30. count_fail += 1
  31. download_fail_person.append(data)
  32. except Exception as err:
  33. print('下载中断,请检查网络后重试')
  34. finally:
  35. print('已下载:', count)
  36. print('未出结果:', count_un_res)
  37. print('下载失败:', count_fail)
  38. print('共计:', count + count_un_res + count_fail)
  39. print('未出结果人员名单:', un_res_person)
  40. print('下载失败人员名单:', download_fail_person)
  41. input("按任意键退出:")

小结

两小时就搞完的东西真的不好意思收别人钱哈哈哈哈哈,朋友的舅舅非要给,小赚100💸