- 爬取的时候很在乎异步爬取、多进程操作等,后来再发现自己路都不会走,还想跑。打好基础!!!
- 第一步观察网页,在XHR中发现数据,其https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1626350822054&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=&pageIndex=2&pageSize=10&language=zh-cn&area=
- timestamp=1626350822054int(time.time() * 1000),pageIndex代表页数
遇到的问题:
1.只输出10个数据,其原因是,页数定义在主函数,会报list index out of range,原因在于
for i in range(0, MAX_PAGE * 10): # 每次主函数调用时,函数只有10的范围 data = datalist[i] for j in range(0, len(col)): sheet.write(i+1, j, data[j])
多学习大佬框架。
解决办法:
1. 在保存函数时增加一个变量,使得保存范围变化
2. 数据保存为字典类型,从而解决问题,需要学习
3.函数解析时,列表保存全部数据。
def parse_response_json(response): datalist = [] for page in range(1, MAX_PAGE + 1): response = scrapy_api(page) """解析响应""" json_data = response['Data']['Posts'] # 判断结果是否有数据 if json_data is None: logging.error('error data') else: # 循环遍历,取出列表中的每一个岗位字典 # 通过key取value值的方法进行采集数据 for j in json_data: data = [] # 工作地点 locationname = j['LocationName'] data.append(locationname) # 工作属性 categoryname = j['CategoryName'] # 往工作属性大列表中添加数据 data.append(categoryname) # 岗位名称 recruitpostName = j['RecruitPostName'] data.append(recruitpostName) # # 岗位职责 responsibility = j['Responsibility'] data.append(responsibility.strip()) # 发布时间 lastupdatetime = j['LastUpdateTime'] data.append(lastupdatetime) # 岗位地址 postURL = j['PostURL'] data.append(postURL) datalist.append(data) logging.info('detail data successfully') # print(datalist) return datalist
保存到exel
def save_excel(datalist): """保存到excel""" # os模块提供很多方法,比如打开文件关闭文件之类的方法 # os.getcwd()返回当前工作目录,返回类型为字符串 os_path_1 = os.getcwd() + '/数据/' # 数据保存位置 # os.path.exists模块, 如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False if not os.path.exists(os_path_1): # 不存在,即创建这个目录,即创建”数据“这个文件夹 # 如果目录有多级,则创建最后一级,如果最后一级目录的上级目录有不存在的,则会抛出一个 OSError。 os.mkdir(os_path_1) os_path_2 = os_path_1 + '腾讯招聘.xls' if not os.path.exists(os_path_2): # 如果不存在,创建新的表格 # 创建新的workbook(其实就是创建新的excel) workbook = xlwt.Workbook(encoding='utf-8') # 创建新的sheet表 # add_sheet(sheetname,cell_overwrite_ok) sheetname 列表名,cell_overwrite_ok 是否可以复写 sheet = workbook.add_sheet("岗位详情", cell_overwrite_ok=True) col = ('岗位名称', '工作地点', '工作属性', '岗位职责', '发布时间', '岗位地址') for i in range(0, len(col)): sheet.write(0, i, col[i]) # 列名 for i in range(0, MAX_PAGE * 10): data = datalist[i] for j in range(0, len(col)): sheet.write(i+1, j, data[j]) workbook.save(os_path_2) # save方法参数是路径,可通过函数调用在全局变量中使用 logging.info('excel save successfully')
OS模块菜鸟教程有教程,创建一个文件夹,生成一个xls文件,还有比较简单的方法:不加条件判断。
def save_excel(datalist, savepath): # 如果不存在,创建新的表格 # 创建新的workbook(其实就是创建新的excel) workbook = xlwt.Workbook(encoding='utf-8') # 创建新的sheet表 # add_sheet(sheetname,cell_overwrite_ok) sheetname 列表名,cell_overwrite_ok 是否可以复写 sheet = workbook.add_sheet("岗位详情", cell_overwrite_ok=True) col = ('岗位名称', '工作地点', '工作属性', '岗位职责', '发布时间', '岗位地址') for i in range(0, len(col)): sheet.write(0, i, col[i]) # 列名 for i in range(0, MAX_PAGE * 10): # 注意时双重列表,其形式位datalist['['url, name'],['url,name']'] data = datalist[i] for j in range(0, len(col)): # 搜索其中的元素 sheet.write(i+1, j, data[j]) # ['url, name'] workbook.save(savepath) # save方法参数是路径,可通过函数调用在全局变量中使用 logging.info('excel save successfully')
使用Request_html模块中的HTMLSession会比较快一点,将request.get换成:
with session.get(url=INDEX_URL, headers=headers, params=params) as response: