第0关
    练习-文章下载-参考
    题目要求:获取文章[《HTTP状态响应码》]全部内容,并且打印出全文内容。
    文本URL:
    https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md

    首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。

    然后需要把Response对象用合适的数据形式返回。

    最后存储数据:

    存储文件的三个步骤:打开文件,存储文件,关闭文件。

    【提示】
    这是一个文本,所以应该使用response.text,把Response对象的内容以字符串的形式返回。

    【解答】
    import requests
    destnationurl = ‘https://localprod.pandateacher.com/python-manuscript/crawler—html/exercise/HTTP%E5%93%8D%E5%BA%94%E7%8A%B6%E6%80%81%E7%A0%81.md
    res = requests.get (destnation_url)
    print(res.status_code) # 查看响应码
    article=res.text # 把Response对象的内容以字符串的形式返回
    print(article)
    练习-图片下载-参考
    题目要求:
    获取下面的图片,并储存图片。
    https://res.pandateacher.com/2019-01-12-15-29-33.png
    完成存储后,重新刷新页面,即可在【文件】内看到图片。

    【提示】
    1. 获取数据
    图片URL:https://res.pandateacher.com/2019-01-12-15-29-33.png
    首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。
    然后需要把Response对象用合适的数据形式返回。

    2. 存储数据
    存储文件的三个步骤:打开文件,存储文件,关闭文件。
    这是一个图片,所以应该使用response.content,把Response对象的内容以二进制数据的形式返回。

    【解答】
    import requests

    res = requests.get(‘https://res.pandateacher.com/2019-01-12-15-29-33.png‘)
    # 发出请求,并把返回的结果放在变量res中
    pic=res.content
    # 把Reponse对象的内容以二进制数据的形式返回
    photo = open(‘spider.jpg’,’wb’)
    # 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。
    # 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
    photo.write(pic)
    # 获取pic的二进制内容
    photo.close()
    # 关闭文件
    练习-音频下载-参考
    题目要求:
    获取下面的音乐,并且储存它,然后请刷新页面,这样你就可以在【文件】内看到它。音乐URL:
    https://static.pandateacher.com/Over%20The%20Rainbow.mp3

    1. 获取数据
    音乐URL:https://static.pandateacher.com/Over%20The%20Rainbow.mp3
    首先调用requests库,使用requests.get(‘URL’)获取文件,返回的是Response对象。
    然后需要把Response对象用合适的数据形式返回。
    2. 存储文件
    存储文件的三个步骤:打开文件,存储文件,关闭文件。

    【提示】
    这是一个音频,所以应该使用response.content,把Response对象的内容以以二进制数据的形式返回。

    【解答】
    import requests
    res=requests.get(‘https://static.pandateacher.com/Over%20The%20Rainbow.mp3‘)
    # 发出请求,并把返回的结果放在变量res中
    mp3=res.content
    # 把Reponse对象的内容以二进制数据的形式返回
    music = open(‘rainbow.mp3’,’wb’)
    # 新建了一个文件ppt.jpg,这里的文件没加路径,它会被保存在程序运行的当前目录下。

    # 图片内容需要以二进制wb读写。你在学习open()函数时接触过它。
    music.write(mp3)

    # 获取pic的二进制内容
    music.close()
    # 关闭文件




    第1关
    练习-我的书苑我作主-参考
    复习了所有知识点,一切都准备就绪,那就开始写属于你的网页吧!
    我已经把网页的HTML源代码准备好了,你直接在上面修改就好。
    现在,请把网页这个书院不太冷5.0修改为你喜欢的模样。

    必做:
    - 修改网页标题
    - 增加至少一本书的描述
    - 修改网页底部

    选做:
    - 修改已有书籍的描述
    - 增加多本书的描述
    - 自由地在HTML文档上修改任意内容

    【提示】

    网页结构修改:
    为了让网页的结构更加清晰,可以把每一本书都写成一个<div>元素。
    细节的修改:
    书籍封面图片的URL,你可以试试用豆瓣书籍主页的图片。右键点击图片,然后选择【复制图片地址】(https://res.pandateacher.com/2019-01-12-21-30-00.png))

    【解答】
    你的书苑你做主。
    这是我给你的参考答案,你可以点开下面的链接看看:
    https://localprod.pandateacher.com/python-manuscript/crawler-html/exercise/01-01-test.html




    第2关
    练习-博客爬虫-参考
    题目要求:
    你需要爬取的是博客【人人都是蜘蛛侠】中,《未来已来(四)——Python学习进阶图谱》的所有文章评论,并且打印。
    文章URL:
    https://wordpress-edu-3autumn.localprod.forc.work/all-about-the-future_04/

    【提示】
    首先,记得调用requests库和BeautifulSoup模块
    然后,按照爬虫的四个步骤来写代码:(不需要写第3步存储数据)
    第0步:获取数据
    requests.get()
    第1步:解析数据
    BeautifulSoup(网页源代码的字符串格式,'html.parser')
    第2步:提取数据
    find_all()
    for循环遍历list
    Tag.text

    【解答】
    首先导入两个模块,然后按照获取数据、解析数据、提取数据一步一步写下来就可以啦~
    import requests # 调用requests库

    from bs4 import BeautifulSoup # 调用BeautifulSoup库

    destnation_url = ‘https://wordpress-edu-3autumn.localprod.forc.work/all-about-the-future_04/

    # 把网址复制给变量destnation_url

    destnation = requests.get (destnation_url) # 返回一个response对象,赋值给destnation

    soup = BeautifulSoup(destnation.text,’html.parser’) # 把网页解析为BeautifulSoup对象

    comments = soup.find_all(‘div’,class
    = ‘comment-content’) #通过匹配属性提取出我们想要的元素

    for comment in comments: # 遍历列表,取出列表中的每一个值

    print(comment.text) # 打印评论的文本


    练习-书店寻宝-参考

    1.第一个小练习
    题目要求:你需要爬取的是网上书店(http://books.toscrape.com/)中所有书的分类类型,并且将它们打印出来。网页URL:[http://books.toscrape.com/](http://books.toscrape.com/)

    【提示】

    要找到就需要先找到所有的li标签,仔细看HTML源代码的结构,这里需要嵌套提取好几层:
    find('ul',class_='nav').find('ul').find_all('li')
    最终打印结果,可以使用str.strip()去除特殊字符串。
    比如,使用.strip()即可去掉’ 我是吴枫\n’文字前面的空格与后面的换行。

    【解答】
    import requests
    from bs4 import BeautifulSoup


    resbookstore = requests.get(‘http://books.toscrape.com/‘)
    bs_bookstore = BeautifulSoup(res_bookstore.text,’html.parser’)
    list_kind = bs_bookstore.find(‘ul’,class
    =’nav’).find(‘ul’).findall(‘li’) # 这里需要提取好几层


    for tag_kind in list_kind:
    tag_name = tag_kind.find(‘a’)
    print(tag_name.text.strip()) # 去除特殊字符串,比如空格,\n,\t等等



    2. 第二个小练习

    题目要求:你需要爬取的是网上书店Books to ScrapeTravel这类书中,所有书的书名、评分、价格三种信息,并且打印提取到的信息。
    网页URL:http://books.toscrape.com/catalogue/category/books/travel_2/index.html
    在此,提取书名和评分都有一定难度,想不到怎么做?查看提示。

    【提示】
    1.提取书名:
    需要注意的是,<a>标签中的文字内容所显示的不是完整书名,完整的书名是<a>标签中,<title>属性的值。
    因此需要用到tag['属性名']来提取属性值。

    2.提取评分:
    需要注意的是,评分藏在了<p>标签的<class>属性中,它是<class>的第1个属性值。
    我们需要根据<class>的第0个属性值<star-rating>提出它的第1个属性值。

    【解答】
    import requests
    from bs4 import BeautifulSoup


    res_bookstore = requests.get(‘http://books.toscrape.com/catalogue/category/books/travel_2/index.html‘)
    bs_bookstore = BeautifulSoup(res_bookstore.text,’html.parser’)
    list_books = bs_bookstore.find_all(class
    =’productpod’)
    for tag_books in list_books:
    tag_name = tag_books.find(‘h3’).find(‘a’) # 找到a标签需要提取两次
    list_star = tag_books.find(‘p’,class
    =”star-rating”)
    # 这个p标签的class属性有两种:”star-rating”,以及具体的几星比如”Two”。我们选择所有书都有的class属性:”star-rating”
    tagprice = tag_books.find(‘p’,class=”pricecolor”) # 价格比较好找,根据属性提取,或者标签与属性一起都可以
    print(tag_name[‘title’]) # 这里用到了tag[‘属性名’]提取属性值
    print(‘star-rating:’,list_star[‘class’][1])
    # 同样是用属性名提取属性值
    # 用list_star[‘class’]提取出来之后是一个由两个值组成的列表,如:”[‘star-rating’, ‘Two’]”,我们最终要提取的是这个列表的第1个值:”Two”。
    # 为什么是列表呢?因为这里的class属性有两个值。其实,在这个过程中,我们是使用class属性的第一个值提取出了第二个值。
    print(‘Price:’,tag_price.text, end=’\n’+’———‘+’\n’) # 打印的时候,我加上了换行,为了让数据更加清晰地分隔开,当然你也可以不加。




    练习-博客文章-参考
    题目要求:你需要爬取的是博客(https://wordpress-edu-3autumn.localprod.forc.work/),首页的四篇文章信息,并且打印提取到的信息。
    提取每篇文章的:
    - 文章标题
    - 发布时间
    - 文章链接
    网页URL:https://spidermen.cn/

    【提示】
    文章题目与URL的提取方式稍有不同:
    html<br /><h2 class="entry-title"><br /> <a href="https://wordpress-edu-3autumn.localprod.forc.work/all-about-the-future_04/" rel="bookmark">未来已来(四)——Python学习进阶图谱</a><br /></h2><br />
    文章标题可以通过<h2>与`<class
    =”entry-title”>找到,并用Tag.text提取出。<br />而文章URL必须定位到元素才可以。<br /> <br />**【解答】**<br />import requests<br />from bs4 import BeautifulSoup<br /> <br /> <br />url_destnation = 'https://spidermen.cn/'<br />res_destnation = requests.get (url_destnation)<br />print(res_destnation.status_code) # 打印响应码<br /> <br /> <br />bs_articles = BeautifulSoup(res_destnation.text,'html.parser')<br />list_articles = bs_articles.find_all('header', class_ = "entry-header") # 首先找到每篇文章所在的相同的元素<br />for tag_article in list_articles: # 遍历列表<br /> tag_title = tag_article.find('h2',class_ = "entry-title") # 找文章标题<br /> tag_url = tag_article.find('a',rel = "bookmark") # 找文章链接<br /> tag_date = tag_article.find('time',class_="entry-date published") # 找文章发布时间<br /> print(tag_title.text,'发布于:',tag_date.text) # 打印文章标题与发布时间<br /> print(tag_url['href']) # 换行打印文章链接,需要使用属性名提取属性值<br /> <br /> <br /> <br /> <br /> <br /> <br />第3关<br />练习-豆瓣爬虫-参考<br />** 第一步:分析问题,明确结果**<br />问题需求就是把豆瓣TOP250里面的 序号/电影名/评分/推荐语/链接 都爬取下来,结果就是全部展示打印出来<br /> <br />**【讲解】**<br />问题需求就是把豆瓣TOP250里面的 序号/电影名/评分/推荐语/链接 都爬取下来,结果就是全部展示打印出来<br /> <br />**第二步:思考要用到的知识**<br />要爬取“序号/电影名/评分/推荐语/链接”这些信息,我们已经学习了用requests.get()获取数据,BeautifulSoup库解析数据,find()和find_all()提取数据,还有呢,观察下,一共10页,我们还要加个for循环对吧~<br /> <br />**【讲解】**<br />接下来我们一起分析网页吧~<br />进入首页 [https://movie.douban.com/top250?start=0&filter=](https://movie.douban.com/top250?start=0&filter=) ,打开检查工具,在Elements里查看这个网页,是什么结构。点击开发者工具左上角的小箭头,选中“肖申克的救赎”,这样就定位了电影名的所在位置,审查元素中显示标签内的文本,class属性;推荐语和评分也是如此,;序号:标签内的文本,class属性;推荐语;链接是标签里href的值。最后,它们最小共同父级标签,是

  • 。<br />我们再换个电影验证下找的规律是否正确。<br />check后,我们再看一共10页,每页的url有什么相关呢?<br />第1页:[https://movie.douban.com/top250?start=0&filter=](https://movie.douban.com/top250?start=0&filter=)<br />第3页:[https://movie.douban.com/top250?start=50&filter=](https://movie.douban.com/top250?start=50&filter=)<br />第7页:[https://movie.douban.com/top250?start=150&filter=](https://movie.douban.com/top250?start=150&filter=)<br />发现只有start后面是有变化哒,规律就是第N页,start=(N-1)*25<br />基于以上分析,我们有两种写爬虫的思路。<br />思路一:先爬取最小共同父级标签
  • ,然后针对每一个父级标签,提取里面的序号/电影名/评分/推荐语/链接。<br />思路二:分别提取所有的序号/所有的电影名/所有的评分/所有的推荐语/所有的链接,然后再按顺序一一对应起来。<br /> <br />**第三步:书写思路一代码**<br />先爬取最小共同父级标签
  • ,然后针对每一个父级标签,提取里面的序号/电影名/评分/推荐语/链接<br />**【解答】**<br />import requests, random, bs4<br /> <br />for x in range(10):<br /> url = 'https://movie.douban.com/top250?start=' + str(x*25) + '&filter='<br /> res = requests.get(url)<br /> bs = bs4.BeautifulSoup(res.text, 'html.parser')<br /> bs = bs.find('ol', class_="grid_view")<br /> for titles in bs.find_all('li'):<br /> num = titles.find('em',class_="").text<br /> #查找序号<br /> title = titles.find('span', class_="title").text<br /> #查找电影名<br /> tes = titles.find('span',class_="inq").text<br /> #查找推荐语<br /> comment = titles.find('span',class_="rating_num").text<br /> #查找评分<br /> url_movie = titles.find('a')['href']<br /> <br /> print(num + '.' + title + '——' + comment + '\n' + '推荐语:' + tes +'\n' + url_movie)<br /> <br /> <br />看着我们需要的信息一条条蹦出来,还是很兴奋哒ლ(❛◡❛✿)ლ 诶,到222条怎么停下来报错了哎,不要慌~<br /> 9 num = titles.find('em',class_="").text<br /> 10 title = titles.find('span', class_="title").text<br />---> 11 tes = titles.find('span',class_="inq").text<br /> 12 comment = titles.find('span',class_="rating_num").text<br /> 13 url_movie = titles.find('a')['href']<br /> <br />AttributeError: 'NoneType' object has no attribute 'text'<br />看下报错信息“AttributeError: 'NoneType' object has no attribute 'text' ” ,定位到了tes这一行,这是推荐语呀,为什么会错呢? 我们回归网页,发现第223个电影是《三块广告牌》,诶,它竟然没有推荐语,而空值是没办法做text文本转换的,因此报错了呢。<br />那怎么解决呢,聪明的你一定想到啦~ Bingo,加一个判断就可以啦~<br />修改过代码,我们再试一下哦~<br /> <br />**【解答】**<br />import requests, random, bs4<br /> <br />for x in range(10):<br /> url = 'https://movie.douban.com/top250?start=' + str(x*25) + '&filter='<br /> res = requests.get(url)<br /> bs = bs4.BeautifulSoup(res.text, 'html.parser')<br /> bs = bs.find('ol', class_="grid_view")<br /> for titles in bs.find_all('li'):<br /> num = titles.find('em',class_="").text<br /> title = titles.find('span', class_="title").text<br /> comment = titles.find('span',class_="rating_num").text<br /> url_movie = titles.find('a')['href']<br /> <br /> if titles.find('span',class_="inq") != None:<br /> tes = titles.find('span',class_="inq").text<br /> print(num + '.' + title + '——' + comment + '\n' + '推荐语:' + tes +'\n' + url_movie)<br /> else:<br /> print(num + '.' + title + '——' + comment + '\n' +'\n' + url_movie)<br /> <br />好啦,250个电影的信息都抓取到了耶,而且我们发现,第223和244都没有推荐语,在网页查看下也确实没有呢。<br />思路一我们已经代码实现啦,举起双手,打开,给自己放个小烟花🎆吧~<br />那思路二对我们来说也是很轻松的事情啦~<br /> <br />**第四步:书写思路二代码**<br />分别提取所有的序号/所有的电影名/所有的评分/所有的推荐语/所有的链接,然后再按顺序一一对应起来。<br /> <br />**【解答】**<br />import requests<br /># 引用requests模块<br />from bs4 import BeautifulSoup<br />for x in range(10):<br /> url = 'https://movie.douban.com/top250?start=' + str(x*25) + '&filter='<br /> res = requests.get(url)<br /> bs = BeautifulSoup(res.text, 'html.parser')<br /> tag_num = bs.find_all('div', class_="item")<br /> # 查找包含序号,电影名,链接的<div>标签<br /> tag_comment = bs.find_all('div', class_='star')<br /> # 查找包含评分的<div>标签<br /> tag_word = bs.find_all('span', class_='inq')<br /> # 查找推荐语<br /> print(len(tag_word),len(tag_num))<br /> <br /> list_all = []<br /> for x in range(len(tag_num)-1):<br /> if tag_num[x].text[2:5] == '223' or tag_num[x].text[2:5] =='244':<br /> list_movie = [tag_num[x].text[2:5], tag_num[x].find('img')['alt'], tag_comment[x].text[2:5], tag_num[x].find('a')['href'] ]<br /> else:<br /> list_movie = [tag_num[x].text[2:5], tag_num[x].find('img')['alt'], tag_comment[x].text[2:5], tag_word[x].text, tag_num[x].find('a')['href']]<br /> list_all.append(list_movie)<br /> print(list_all)<br /> <br />练习-一键下电影-参考<br /> <br />**第一步:分析问题,明确目标**<br />我们想要实现这样的功能:用户输入喜欢的电影名字,程序即可在电影天堂(https://www.ygdy8.com)爬取电影所对应的下载链接,并将下载链接打印出来。<br /> <br />**【讲解】**<br />我们知道爬虫是模拟人在浏览器的动作批量获取有价值的信息,那对于这道题,我们先手动操作下,看看人是如何实现这个过程的。<br />首先,打开电影天堂(https://www.ygdy8.com) , 在”搜索“处,填写一部电影名,以”无名之辈“为例,然后,我们进入了“搜索结果”页面,最后,在下载页面滑到最下方,找到了下载地址。<br />人工操作的步骤,我们是不是可以将其分为 “输名字 - 查搜索结果 - 进入下载页面 - 找到下载链接” ? 呐,我们就让我们的爬虫也这样子走就可以了对吧~ <br /> <br />**第二步:分析讲解**<br />“输名字 - 查搜索结果 - 进入下载页面 - 找到下载链接”<br />我们是这样找到下载链接的,那只要让我们的爬虫也走这样的步骤, 就可以达成我们的目标啦<br /> <br />**【讲解】**<br />步骤一<br />“输名字”,学过基础课的同学一定可以想到,用input()就可以啦。<br />步骤二<br />”搜索结果页面“ 这里面涉及到一个坑,我们要一起填上。<br />输入不同的电影名,观察搜索结果页面的URL:<br />《无名之辈》的搜索结果URL:[http://s.ygdy8.com/plus/so.php?typeid=1&keyword=%CE%DE%C3%FB%D6%AE%B1%B2](http://s.ygdy8.com/plus/so.php?typeid=1&keyword=%CE%DE%C3%FB%D6%AE%B1%B2)<br />[《](http%3A%2F%2Fs.ygdy8.com%2Fplus%2Fso.php%3Ftypeid%3D1%26keyword%3D%25CE%25DE%25C3%25FB%25D6%25AE%25B1%25B2%28http%3A%2F%2Fs.ygdy8.com%2Fplus%2Fso.php%3Ftypeid%3D1%26keyword%3D%25CE%25DE%25C3%25FB%25D6%25AE%25)[神](http%3A%2F%2Fs.ygdy8.com%2Fplus%2Fso.php%3Ftypeid%3D1%26keyword%3D%25CE%25DE%25C3%25FB%25D6%25AE%25B1%25B2%28http%3A%2F%2Fs.ygdy8.com%2Fplus%2Fso.php%3Ftypeid%3D1%26keyword%3D%25CE%25DE%25C3%25FB%25D6%25AE%25B)[奇](http://s.ygdy8.com/plus/so.php?typeid=1&keyword=%CE%DE%C3%FB%D6%AE%B1%B2(http://s.ygdy8.com/plus/so.php?typeid=1&keyword=%CE%DE%C3%FB%D6%AE%B1)[动](http%3A%2F%2Fs.ygdy8.com%2Fplus%2Fso.php%3Ftypeid%3D1%26keyword%3D%25CE%25DE%25C3%25FB%25D6%25AE%25B1%25B2%28http%3A%2F%2Fs.ygdy8.com%2Fplus%2Fso.php%3Ftypeid%3D1%26keyword%3D%25CE%25DE%25C3%25FB%25D6%25AE%25B1%25)[物](http%3A%2F%2Fs.ygdy8.com%2Fplus%2Fso.php%3Ftypeid%3D1%26keyword%3D%25CE%25DE%25C3%25FB%25D6%25AE%25B1%25B2%28http%3A%2F%2Fs.ygdy8.com%2Fplus%2Fso.php%3Ftypeid%3D1%26keyword%3D%25CE%25DE%25C3%25FB%25D6%25AE%25B1%25B)》的搜索结果URL:[http://s.ygdy8.com/plus/so.php?typeid=1&keyword=%C9%F1%C6%E6%B6%AF%CE%EF](http://s.ygdy8.com/plus/so.php?typeid=1&keyword=%C9%F1%C6%E6%B6%AF%CE%EF)<br />《狗十三》 的搜索结果URL:[http://s.ygdy8.com/plus/so.php?typeid=1&keyword=%B9%B7%CA%AE%C8%FD](http://s.ygdy8.com/plus/so.php?typeid=1&keyword=%B9%B7%CA%AE%C8%FD)<br />观察URL,不难发现:[http://s.ygdy8.com/plus/so.php?typeid=1&keyword=](http://s.ygdy8.com/plus/so.php?typeid=1&keyword=)() 这些都是一样的,只不过不同的电影名对应URL后面加了一些我们看不懂的字符<br />请阅读以下代码,注意注释哦:<br />a= '无名之辈'<br />b= a.encode('gbk')<br /># 将汉字,用gbk格式编码,赋值给b<br />print(quote(b))<br /># quote()函数,可以帮我们把内容转为标准的url格式,作为网址的一部分打开<br />输出结果是:<br />%CE%DE%C3%FB%D6%AE%B1%B2<br />记得在本地IDE上试着敲下哦,可以把‘无名之辈’换成神奇动物和狗十三,看看输出结果是否和对应的编码一致。<br />诶,发现的确是一致的,那我们一起来解读这段代码是怎么实现的呢。<br /> <br />注释中提到了gbk格式编码,那gbk是什么呢?<br />_GBK编码_ <br/><br /> GBK是中国标准,只在中国使用,并没有表示大多数其它国家的编码;<br /> 而各国又陆续推出各自的编码标准,互不兼容,非常不利于全球化发展。<br /> 于是后来国际组织发行了一个全球统一编码表,把全球各国文字都统一在一个编码标准里,名为Unicode。<br />由此我们知道,想把中文转换成url格式,需要先用encode('gbk')将其转成gbk编码,然后再用quote()把它转化成url的一部分。<br />然后再将它与[http://s.ygdy8.com/plus/so.php?typeid=1&keyword=]()拼接起来就是电影的搜索结果页面啦~<br />好,总结下上面的这个知识点,如何建立“输入电影名”与“搜索结果页面”的联系: <br /> __中文 - gbk - url - 拼接__<br />这样我们就把完整的搜索结果页面找到并提取出来了。<br><br /> <br />步骤三 + 步骤四<br />”进入下载页面“ 与 “找到下载链接” 就是解析网页定位啦,利用find() 和 find_all(),都是你会的内容,加油呀~<br /> <br />**第三步:书写代码吧 (。▰‿‿▰。) ❤**<br /> <br />前两步我们已经捋顺了思路,还填了一个小坑,现在要自己敲代码咯,对转换格式编码的代码记不清的同学,可以偷偷看下提示哦。<br /> <br />**【提示】**<br />将汉字,用gbk格式编码,赋值,这时需要encode(),还需要用到quote()函数,可以帮我们把内容转为标准的url格式,作为网址的一部分打开。<br />定位下载链接还是要用到find()哦~ <br />有些电影没有下载链接,记得加个判断呀~<br /> <br />**【解答】**<br />import requests<br />from bs4 import BeautifulSoup<br />from urllib.request import quote<br />#quote()函数,可以帮我们把内容转为标准的url格式,作为网址的一部分打开<br /> <br /> <br />movie = input('你想看什么电影呀?')<br />gbkmovie = movie.encode('gbk')<br />#将汉字,用gbk格式编码,赋值给gbkmovie<br />url = 'http://s.ygdy8.com/plus/so.php?typeid=1&keyword='+quote(gbkmovie)<br />#将gbk格式的内容,转为url,然后和前半部分的网址拼接起来。<br />res = requests.get(url)<br />#下载××电影的搜索页面<br />res.encoding ='gbk'<br />#定义res的编码类型为gbk<br />soup_movie = BeautifulSoup(res.text,'html.parser')<br />#解析网页<br />urlpart = soup_movie.find(class_="co_content8").find_all('table')<br /># print(urlpart)<br /> <br /> <br />if urlpart:<br /> urlpart = urlpart[0].find('a')['href']<br /> urlmovie = 'https://www.ygdy8.com/' + urlpart<br /> res1 = requests.get(urlmovie)<br /> res1.encoding = 'gbk'<br /> soup_movie1 = BeautifulSoup(res1.text,'html.parser')<br /> urldownload = soup_movie1.find('div',id="Zoom").find('span').find('table').find('a')['href']<br /> print(urldownload)<br />else:<br /> print('没有' + movie)<br /> # 有些电影是查询不到没下载链接的,因此加了个判断<br /> <br /> <br /> <br /> <br /> <br /> <br />第5关<br />练习-歌词爬取-参考<br />**第一步:分析问题,明确结果**<br />问题需求就是把关卡内的代码稍作修改,将周杰伦前五页歌曲的歌词都爬取下来,结果就是全部展示打印出来。<br /> <br />**【讲解】**<br />问题需求就是把关卡内的代码稍作修改,将周杰伦前五页歌曲的歌词都爬取下来,结果就是全部展示打印出来。<br /> <br />**第二步:写代码**<br /> <br />**【提示】**<br /> Network - XHR-client_search - Headers - Query String Parameters , 观察里面参数的变化<br /> <br />**【解答】**<br />import requests<br />import json<br /># 引用requests,json模块<br /> <br />url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'<br /> <br />headers = {<br /> 'referer':'https://y.qq.com/portal/search.html',<br /> # 请求来源<br /> 'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'<br /> # 标记了请求从什么设备,什么浏览器上发出<br /> }<br /> <br />for x in range(5):<br /> <br /> params = {<br /> 'ct':'24',<br /> 'qqmusic_ver': '1298',<br /> 'new_json':'1',<br /> 'remoteplace':'sizer.yqq.lyric_next',<br /> 'searchid':'94267071827046963',<br /> 'aggr':'1',<br /> 'cr':'1',<br /> 'catZhida':'1',<br /> 'lossless':'0',<br /> 'sem':'1',<br /> 't':'7',<br /> 'p':str(x+1),<br /> 'n':'10',<br /> 'w':'周杰伦',<br /> 'g_tk':'1714057807',<br /> 'loginUin':'0',<br /> 'hostUin':'0',<br /> 'format':'json',<br /> 'inCharset':'utf8',<br /> 'outCharset':'utf-8',<br /> 'notice':'0',<br /> 'platform':'yqq.json',<br /> 'needNewCode':'0' <br /> }<br /> <br /> res = requests.get(url, params = params)<br /> #下载该网页,赋值给res<br /> jsonres = json.loads(res.text)<br /> #使用json来解析res.text<br /> list_lyric = jsonres['data']['lyric']['list']<br /> #一层一层地取字典,获取歌词的列表<br /> <br /> for lyric in list_lyric:<br /> #lyric是一个列表,x是它里面的元素<br /> print(lyric['content'])<br /> #以content为键,查找歌词<br /> <br /> <br />练习-头条粉丝-参考<br />**第一步: 阅读代码**<br />作为头号粉丝,只爬取歌词不能满足迷妹迷弟们~我们还想要爬取自己喜欢的歌手音乐信息~<br />现在,请你阅读关卡内代码,思考应该如何修改它。<br /> <br />**【提示】**<br />阅读代码就可以了。<br /> <br />**【讲解】**<br />import requests, json<br />#引用requests,json模块<br /> <br />url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'<br />for x in range(5):<br /> <br /> params = {<br /> 'ct':'24',<br /> 'qqmusic_ver': '1298',<br /> 'new_json':'1',<br /> 'remoteplace':'txt.yqq.song',<br /> 'searchid':'70717568573156220',<br /> 't':'0',<br /> 'aggr':'1',<br /> 'cr':'1',<br /> 'catZhida':'1',<br /> 'lossless':'0',<br /> 'flag_qc':'0',<br /> 'p':str(x+1),<br /> 'n':'20',<br /> 'w':'周杰伦',<br /> 'g_tk':'714057807',<br /> 'loginUin':'0',<br /> 'hostUin':'0',<br /> 'format':'json',<br /> 'inCharset':'utf8',<br /> 'outCharset':'utf-8',<br /> 'notice':'0',<br /> 'platform':'yqq.json',<br /> 'needNewCode':'0' <br /> }<br /> # 将参数封装为字典<br /> res_music = requests.get(url,params=params)<br /> # 调用get方法,下载这个列表<br /> json_music = res_music.json()<br /> # 使用json()方法,将response对象,转为列表/字典<br /> list_music = json_music['data']['song']['list']<br /> # 一层一层地取字典,获取歌单列表<br /> for music in list_music:<br /> # list_music是一个列表,music是它里面的元素<br /> print(music['name'])<br /> # 以name为键,查找歌曲名<br /> print('所属专辑:'+music['album']['name'])<br /> # 查找专辑名<br /> print('播放时长:'+str(music['interval'])+'秒')<br /> # 查找播放时长<br /> print('播放链接:https://y.qq.com/n/yqq/song/'+music['mid']+'.html\n\n')<br /> # 查找播放链接<br /> <br />运行右侧代码发现我们只爬取到了周杰伦的歌曲信息,那么想做到一键换成任何喜欢的歌手该怎么做呢? 我们发现params里面的w`对应的是歌手名字,那么我们就可以用input来替换掉呀~


    第二步: 修改代码
    作为头号粉丝,只爬取歌词不能满足迷妹迷弟们~我们还想要爬取自己喜欢的歌手音乐信息~
    现在,请你尝试修改代码。借助input()函数,实现爬取任意一个歌手的音乐信息。

    【提示】
    singer = input(‘你最喜欢的歌手是谁呀?’)

    【解答】
    import requests, json

    # 引用requests模块
    url = ‘
    https://c.y.qq.com/soso/fcgi-bin/client_search_cp
    singer = input(‘你喜欢的歌手是谁呢?’)
    for x in range(6):

    params = {
    ‘ct’:’24’,
    ‘qqmusic_ver’: ‘1298’,
    ‘new_json’:’1’,
    ‘remoteplace’:’txt.yqq.song’,
    ‘searchid’:’70717568573156220’,
    ‘t’:’0’,
    ‘aggr’:’1’,
    ‘cr’:’1’,
    ‘catZhida’:’1’,
    ‘lossless’:’0’,
    ‘flag_qc’:’0’,
    ‘p’:str(x+1),
    ‘n’:’20’,
    ‘w’:singer,
    ‘g_tk’:’714057807’,
    ‘loginUin’:’0’,
    ‘hostUin’:’0’,
    ‘format’:’json’,
    ‘inCharset’:’utf8’,
    ‘outCharset’:’utf-8’,
    ‘notice’:’0’,
    ‘platform’:’yqq.json’,
    ‘needNewCode’:’0’
    }
    # 将参数封装为字典
    res_music = requests.get(url,params=params)
    # 调用get方法,下载这个列表
    json_music = res_music.json()
    # 使用json()方法,将response对象,转为列表/字典
    list_music = json_music[‘data’][‘song’][‘list’]
    # 一层一层地取字典,获取歌单列表
    for music in list_music:
    # list_music是一个列表,music是它里面的元素
    print(music[‘name’])
    # 以name为键,查找歌曲名
    print(‘所属专辑:’+music[‘album’][‘name’])
    # 查找专辑名
    print(‘播放时长:’+str(music[‘interval’])+’秒’)
    # 查找播放时长
    print(‘播放链接:https://y.qq.com/n/yqq/song/'+music['mid']+'.html\n\n‘)
    # 查找播放链接


    练习-一键查快递-参考
    第一步:分析需求,明确目标

    实现功能:用户输入快递名称和单号,程序即可在快递100(https://www.kuaidi100.com/)爬取最新物流状态,并将其打印出来。

    【讲解】
    先进入快递100(https://www.kuaidi100.com/) 感受下手动搜索的流程,
    如图,红框框里的是我们需要输入与想要提取的信息:

    第二步:书写代码吧 (。▰‿‿▰。) ❤
    如果没思路,可以偷偷看下提示哦~

    【提示】
    Network - query?type… - Headers - Query String Parameters , 观察里面参数的变化~
    服务器返回的内容,是json的格式。我们可以用处理列表、处理字典的手段来提取物流状态哦

    【解答】
    import requests
    #调用requests模块,负责上传和下载数据

    logisticsName = input(‘你的快递是什么物流呀?’)
    courierNum = input(‘你的快递单号是什么呀?’)

    url = ‘https://www.kuaidi100.com/query?
    #使用get需要一个链接

    params = {
    ‘type’: logisticsName,
    ‘postid’: courierNum,
    ‘temp’: ‘0.9661515218223198’,
    ‘phone’:’’
    }
    #将需要get的内容,以字典的形式记录在params内

    r = requests.get(url, params=params)
    #get需要输入两个参数,一个是刚才的链接,一个是params,返回的是一个Response对象
    result = r.json()

    print (‘最新物流状态‘:’+ result[‘data’][0][‘context’])
    #记得观察preview里面的参数哦