百度飞桨学习——七日打卡作业选手信息爬取

从来好事天生俭,自古瓜儿苦后甜。这篇文章主要讲述百度飞桨学习——七日打卡作业选手信息爬取相关的知识,希望能为你提供帮助。
百度飞桨学习——七日打卡作业(二)选手信息爬取 【百度飞桨学习——七日打卡作业选手信息爬取】
文章目录

  • 百度飞桨学习——七日打卡作业(二)选手信息爬取
    • 上网的全过程
      • 普通用户
      • 爬虫程序
      • 爬虫的过程
    • 使用的模块
    • 爬取百度百科中《青春有你2》中所有参赛选手信息,返回页面数据
    • 对爬取的页面数据进行解析,并保存为JSON文件
    • 爬取每个选手的百度百科图片,并进行保存
    • 打印爬取的所有图片的路径
    • 输出

上网的全过程 普通用户
打开浏览器往目标站点发送请求接收响应数据渲染到页面上爬虫程序
模拟浏览器往目标站点发送请求接收响应数据提取有用的数据保存到本地或数据库爬虫的过程
requests模块服务器返回BeautifulSoup查找或者re正则发送请求获取响应数据解析并提取数据保存数据使用的模块 request模块
requests是python实现的简单易用的HTTP库,官网地址:http://cn.python-requests.org/zh_CN/latest/requests.get(url)可以发送一个http get请求,返回服务器响应内容。

BeautifulSoup
BeautifulSoup 是一个可以从html或XML文件中提取数据的Python库。网址:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml。BeautifulSoup(markup, "html.parser")或者BeautifulSoup(markup, "lxml"),推荐使用lxml作为解析器,因为效率更高。

爬取百度百科中《青春有你2》中所有参赛选手信息,返回页面数据
import json import re import requests import datetime from bs4 import BeautifulSoup import os#获取当天的日期,并进行格式化,用于后面文件命名,格式:20200420 today = datetime.date.today().strftime(%Y%m%d)def crawl_wiki_data(): """ 爬取百度百科中《青春有你2》中参赛选手信息,返回html """ headers = User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36url=https://baike.baidu.com/item/青春有你第二季try: response = requests.get(url,headers=headers) # print(response.status_code)#将一段文档传入BeautifulSoup的构造方法,就能得到一个文档的对象, 可以传入一段字符串 soup = BeautifulSoup(response.text,lxml)#返回的是class为table-view log-set-param的< table> 所有标签 tables = soup.find_all(table,class:table-view log-set-param)crawl_table_title = "参赛学员"for table intables: #对当前节点前面的标签和字符串进行查找 table_titles = table.find_previous(div).find_all(h3) for title in table_titles: if(crawl_table_title in title): return table except Exception as e: print(e)

对爬取的页面数据进行解析,并保存为JSON文件
def parse_wiki_data(table_html):从百度百科返回的html中解析得到选手信息,以当前日期作为文件名,存JSON文件,保存到work目录下bs = BeautifulSoup(str(table_html),lxml) all_trs = bs.find_all(tr)error_list = [\\,\\"]stars = []for tr in all_trs[1:]: all_tds = tr.find_all(td)star = #姓名 star["name"]=all_tds[0].text #个人百度百科链接 star["link"]= https://baike.baidu.com + all_tds[0].find(a).get(href) #籍贯 star["zone"]=all_tds[1].text #星座 star["constellation"]=all_tds[2].text #身高 star["height"]=all_tds[3].text #体重 star["weight"]= all_tds[4].text#花语,去除掉花语中的单引号或双引号 flower_word = all_tds[5].text for c in flower_word: ifc in error_list: flower_word=flower_word.replace(c,) star["flower_word"]=flower_word #公司 if not all_tds[6].find(a) isNone: star["company"]= all_tds[6].find(a).text else: star["company"]= all_tds[6].textstars.append(star)json_data = https://www.songbingjia.com/android/json.loads(str(stars).replace("\\","\\"")) with open(work/ + today + .json, w, encoding=UTF-8) as f: json.dump(json_data, f, ensure_ascii=False)

爬取每个选手的百度百科图片,并进行保存
def crawl_pic_urls():爬取每个选手的百度百科图片,并保存with open(work/+ today + .json, r, encoding=UTF-8) as file: json_array = json.loads(file.read())headers = User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36 for star in json_array:name = star[name] link = star[link] pic_urls = []#预先设定一个空列表作为存储图片链接地址 #!!!请在以下完成对每个选手图片的爬取,将所有图片url存储在一个列表pic_urls中!!! response = requests.get(link,headers=headers) soup = BeautifulSoup(response.text,lxml) urls = soup.select(.summary-pic a)[0].get(href)#获取图集地址 urls = https://baike.baidu.com+urls pic_response = requests.get(urls,headers = headers) soup = BeautifulSoup(pic_response.text,lxml) pic_list = soup.select(.pic-list img ) for pic in pic_list: url = pic.get(src) pic_urls.append(url) down_pic(name,pic_urls)

def down_pic(name,pic_urls):根据图片链接列表pic_urls, 下载所有图片,保存在以name命名的文件夹中,path = work/+pics/+name+/if not os.path.exists(path): os.makedirs(path)for i, pic_url in enumerate(pic_urls): try: pic = requests.get(pic_url, timeout=15) string = str(i + 1) + .jpg with open(path+string, wb) as f: f.write(pic.content) # print(成功下载第%s张图片: %s % (str(i + 1), str(pic_url))) except Exception as e: print(下载第%s张图片时失败: %s % (str(i + 1), str(pic_url))) print(e) continue

打印爬取的所有图片的路径
def show_pic_path(path):遍历所爬取的每张图片,并打印所有图片的绝对路径pic_num = 0 for (dirpath,dirnames,filenames) in os.walk(path): for filename in filenames: pic_num += 1 print("第%d张照片:%s" % (pic_num,os.path.join(dirpath,filename))) print("共爬取《青春有你2》选手的%d照片" % pic_num)

if __name__ == __main__:#爬取百度百科中《青春有你2》中参赛选手信息,返回html html = crawl_wiki_data()#解析html,得到选手信息,保存为json文件 parse_wiki_data(html)#从每个选手的百度百科页面上爬取图片,并保存 crawl_pic_urls()#打印所爬取的选手图片路径 show_pic_path(/home/aistudio/work/pics/)print("所有信息爬取完成!")

输出
...... 第465张照片:/home/aistudio/work/pics/孙芮/2.jpg 第466张照片:/home/aistudio/work/pics/孙芮/3.jpg 第467张照片:/home/aistudio/work/pics/孙芮/5.jpg 第468张照片:/home/aistudio/work/pics/孙芮/6.jpg 第469张照片:/home/aistudio/work/pics/孙芮/1.jpg 第470张照片:/home/aistudio/work/pics/孙芮/7.jpg 第471张照片:/home/aistudio/work/pics/孙芮/4.jpg 第472张照片:/home/aistudio/work/pics/王心茗/1.jpg 第473张照片:/home/aistudio/work/pics/刘雨昕/9.jpg 第474张照片:/home/aistudio/work/pics/刘雨昕/2.jpg 第475张照片:/home/aistudio/work/pics/刘雨昕/10.jpg 第476张照片:/home/aistudio/work/pics/刘雨昕/3.jpg 第477张照片:/home/aistudio/work/pics/刘雨昕/8.jpg 第478张照片:/home/aistudio/work/pics/刘雨昕/5.jpg 第479张照片:/home/aistudio/work/pics/刘雨昕/6.jpg 第480张照片:/home/aistudio/work/pics/刘雨昕/1.jpg 第481张照片:/home/aistudio/work/pics/刘雨昕/7.jpg 第482张照片:/home/aistudio/work/pics/刘雨昕/4.jpg 共爬取《青春有你2》选手的482照片 所有信息爬取完成!


    推荐阅读