当前位置:   article > 正文

适合新手小白的几个练习Python爬虫的实战!_在哪里可以练习爬虫

在哪里可以练习爬虫

经常有新手小白在学习完 Python 的基础知识之后,不知道该如何进一步提升编码水平,那么此时找一些友好的网站来练习爬虫可能是一个比较好的方法,因为高级爬虫本身就需要掌握很多知识点,以爬虫作为切入点,既可以掌握巩固 Python 知识,也可能在未来学习接触到更多其他方面的知识,比如分布式,多线程等等,何乐而不为呢!

下面我们介绍几个非常简单入门的爬虫项目,相信不会再出现那种直接劝退的现象啦!

【豆瓣】

豆瓣作为国民级网站,在爬虫方面也非常友好,几乎没有设置任何反爬措施,以此网站来练手实在是在适合不过了。

1、评论爬取

我们以如下地址为例子

https://movie.douban.com/subject/3878007/

可以看到这里需要进行翻页处理,通过观察发现,评论的URL如下:

https://movie.douban.com/subject/3878007/comments?start=0&limit=20&sort=new_score&status=P&percent_type=l

每次翻一页,start都会增长20,由此可以写代码如下

  1. def get_praise():
  2.     praise_list = []
  3.     for i in range(0200020):
  4.         url = 'https://movie.douban.com/subject/3878007/comments?start=%s&limit=20&sort=new_score&status=P&percent_type=h' % str(i)
  5.         req = requests.get(url).text
  6.         content = BeautifulSoup(req, "html.parser")
  7.         check_point = content.title.string
  8.         if check_point != r"没有访问权限":
  9.             comment = content.find_all("span", attrs={"class""short"})
  10.             for k in comment:
  11.                 praise_list.append(k.string)
  12.         else:
  13.             break
  14.     return 

使用range函数,步长设置为20,同时通过title等于“没有访问权限”来作为翻页的终点。

下面继续分析评论等级

豆瓣的评论是分为三个等级的,这里分别获取,方便后面的继续分析

  1. def get_ordinary():
  2.     ordinary_list = []
  3.     for i in range(0200020):
  4.         url = 'https://movie.douban.com/subject/3878007/comments?start=%s&limit=20&sort=new_score&status=P&percent_type=m' % str(i)
  5.         req = requests.get(url).text
  6.         content = BeautifulSoup(req, "html.parser")
  7.         check_point = content.title.string
  8.         if check_point != r"没有访问权限":
  9.             comment = content.find_all("span", attrs={"class""short"})
  10.             for k in comment:
  11.                 ordinary_list.append(k.string)
  12.         else:
  13.             break
  14.     return 
  15. def get_lowest():
  16.     lowest_list = []
  17.     for i in range(0200020):
  18.         url = 'https://movie.douban.com/subject/3878007/comments?start=%s&limit=20&sort=new_score&status=P&percent_type=l' % str(i)
  19.         req = requests.get(url).text
  20.         content = BeautifulSoup(req, "html.parser")
  21.         check_point = content.title.string
  22.         if check_point != r"没有访问权限":
  23.             comment = content.find_all("span", attrs={"class""short"})
  24.             for k in comment:
  25.                 lowest_list.append(k.string)
  26.         else:
  27.             break
  28.     return 

其实可以看到,这里的三段区别主要在请求URL那里,分别对应豆瓣的好评,一般和差评。

最后把得到的数据保存到文件里

  1. if __name__ == "__main__":
  2.     print("Get Praise Comment")
  3.     praise_data = get_praise()
  4.     print("Get Ordinary Comment")
  5.     ordinary_data = get_ordinary()
  6.     print("Get Lowest Comment")
  7.     lowest_data = get_lowest()
  8.     print("Save Praise Comment")
  9.     praise_pd = pd.DataFrame(columns=['praise_comment'], data=praise_data)
  10.     praise_pd.to_csv('praise.csv', encoding='utf-8')
  11.     print("Save Ordinary Comment")
  12.     ordinary_pd = pd.DataFrame(columns=['ordinary_comment'], data=ordinary_data)
  13.     ordinary_pd.to_csv('ordinary.csv', encoding='utf-8')
  14.     print("Save Lowest Comment")
  15.     lowest_pd = pd.DataFrame(columns=['lowest_comment'], data=lowest_data)
  16.     lowest_pd.to_csv('lowest.csv', encoding='utf-8')
  17.     print("THE END!!!")

2、制作词云

这里使用jieba来分词,使用wordcloud库制作词云,还是分成三类,同时去掉了一些干扰词,比如“一部”、“一个”、“故事”和一些其他名词,操作都不是很难,直接上代码

  1. import jieba
  2. import pandas as pd
  3. from wordcloud import WordCloud
  4. import numpy as np
  5. from PIL import Image
  6. font = r'C:\Windows\Fonts\FZSTK.TTF'
  7. STOPWORDS = set(map(str.strip, open('stopwords.txt').readlines()))
  8. def wordcloud_praise():
  9.     df = pd.read_csv('praise.csv', usecols=[1])
  10.     df_list = df.values.tolist()
  11.     comment_after = jieba.cut(str(df_list), cut_all=False)
  12.     words = ' '.join(comment_after)
  13.     img = Image.open('haiwang8.jpg')
  14.     img_array = np.array(img)
  15.     wc = WordCloud(width=2000, height=1800, background_color='white', font_path=font, mask=img_array, stopwords=STOPWORDS)
  16.     wc.generate(words)
  17.     wc.to_file('praise.png')
  18. def wordcloud_ordinary():
  19.     df = pd.read_csv('ordinary.csv', usecols=[1])
  20.     df_list = df.values.tolist()
  21.     comment_after = jieba.cut(str(df_list), cut_all=False)
  22.     words = ' '.join(comment_after)
  23.     img = Image.open('haiwang8.jpg')
  24.     img_array = np.array(img)
  25.     wc = WordCloud(width=2000, height=1800, background_color='white', font_path=font, mask=img_array, stopwords=STOPWORDS)
  26.     wc.generate(words)
  27.     wc.to_file('ordinary.png')
  28. def wordcloud_lowest():
  29.     df = pd.read_csv('lowest.csv', usecols=[1])
  30.     df_list = df.values.tolist()
  31.     comment_after = jieba.cut(str(df_list), cut_all=False)
  32.     words = ' '.join(comment_after)
  33.     img = Image.open('haiwang7.jpg')
  34.     img_array = np.array(img)
  35.     wc = WordCloud(width=2000, height=1800, background_color='white', font_path=font, mask=img_array, stopwords=STOPWORDS)
  36.     wc.generate(words)
  37.     wc.to_file('lowest.png')
  38. if __name__ == "__main__":
  39.     print("Save praise wordcloud")
  40.     wordcloud_praise()
  41.     print("Save ordinary wordcloud")
  42.     wordcloud_ordinary()
  43.     print("Save lowest wordcloud")
  44.     wordcloud_lowest()
  45.     print("THE END!!!")

3、海报爬取

对于海报的爬取,其实也十分类似,直接给出代码

  1. import requests
  2. import json
  3. def deal_pic(url, name):
  4.     pic = requests.get(url)
  5.     with open(name + '.jpg''wb'as f:
  6.         f.write(pic.content)
  7. def get_poster():
  8.     for i in range(01000020):
  9.         url = 'https://movie.douban.com/j/new_search_subjects?sort=U&range=0,10&tags=电影&start=%s&genres=爱情' % i
  10.         req = requests.get(url).text
  11.         req_dict = json.loads(req)
  12.         for j in req_dict['data']:
  13.             name = j['title']
  14.             poster_url = j['cover']
  15.             print(name, poster_url)
  16.             deal_pic(poster_url, name)
  17. if __name__ == "__main__":
  18.     get_poster()

【烂番茄网站】

这是一个国外的电影影评网站,也比较适合新手练习,网址如下

https://www.rottentomatoes.com/tv/game_of_thrones

我们就以权力的游戏作为爬取例子

  1. import requests
  2. from bs4 import BeautifulSoup
  3. from pyecharts.charts import Line
  4. import pyecharts.options as opts
  5. from wordcloud import WordCloud
  6. import jieba
  7. baseurl = 'https://www.rottentomatoes.com'
  8. def get_total_season_content():
  9.     url = 'https://www.rottentomatoes.com/tv/game_of_thrones'
  10.     response = requests.get(url).text
  11.     content = BeautifulSoup(response, "html.parser")
  12.     season_list = []
  13.     div_list = content.find_all('div', attrs={'class''bottom_divider media seasonItem '})
  14.     for i in div_list:
  15.         suburl = i.find('a')['href']
  16.         season = i.find('a').text
  17.         rotten = i.find('span', attrs={'class''meter-value'}).text
  18.         consensus = i.find('div', attrs={'class''consensus'}).text.strip()
  19.         season_list.append([season, suburl, rotten, consensus])
  20.     return season_list
  21. def get_season_content(url):
  22.     # url = 'https://www.rottentomatoes.com/tv/game_of_thrones/s08#audience_reviews'
  23.     response = requests.get(url).text
  24.     content = BeautifulSoup(response, "html.parser")
  25.     episode_list = []
  26.     div_list = content.find_all('div', attrs={'class''bottom_divider'})
  27.     for i in div_list:
  28.         suburl = i.find('a')['href']
  29.         fresh = i.find('span', attrs={'class''tMeterScore'}).text.strip()
  30.         episode_list.append([suburl, fresh])
  31.     return episode_list[:5]
  32. mylist = [['/tv/game_of_thrones/s08/e01''92%'],
  33.           ['/tv/game_of_thrones/s08/e02''88%'],
  34.           ['/tv/game_of_thrones/s08/e03''74%'],
  35.           ['/tv/game_of_thrones/s08/e04''58%'],
  36.           ['/tv/game_of_thrones/s08/e05''48%'],
  37.           ['/tv/game_of_thrones/s08/e06''49%']]
  38. def get_episode_detail(episode):
  39.     # episode = mylist
  40.     e_list = []
  41.     for i in episode:
  42.         url = baseurl + i[0]
  43.         # print(url)
  44.         response = requests.get(url).text
  45.         content = BeautifulSoup(response, "html.parser")
  46.         critic_consensus = content.find('p', attrs={'class''critic_consensus superPageFontColor'}).text.strip().replace(' ''').replace('\n''')
  47.         review_list_left = content.find_all('div', attrs={'class''quote_bubble top_critic pull-left cl '})
  48.         review_list_right = content.find_all('div', attrs={'class''quote_bubble top_critic pull-right  '})
  49.         review_list = []
  50.         for i_left in review_list_left:
  51.             left_review = i_left.find('div', attrs={'class''media-body'}).find('p').text.strip()
  52.             review_list.append(left_review)
  53.         for i_right in review_list_right:
  54.             right_review = i_right.find('div', attrs={'class''media-body'}).find('p').text.strip()
  55.             review_list.append(right_review)
  56.         e_list.append([critic_consensus, review_list])
  57.     print(e_list)
  58. if __name__ == '__main__':
  59.     total_season_content = get_total_season_content()

【王者英雄网站】

我这里选取的是如下网站

http://db.18183.com/

  1. import requests
  2. from bs4 import BeautifulSoup
  3. def get_hero_url():
  4.     print('start to get hero urls')
  5.     url = 'http://db.18183.com/'
  6.     url_list = []
  7.     res = requests.get(url + 'wzry').text
  8.     content = BeautifulSoup(res, "html.parser")
  9.     ul = content.find('ul', attrs={'class'"mod-iconlist"})
  10.     hero_url = ul.find_all('a')
  11.     for i in hero_url:
  12.         url_list.append(i['href'])
  13.     print('finish get hero urls')
  14.     return url_list
  15. def get_details(url):
  16.     print('start to get details')
  17.     base_url = 'http://db.18183.com/'
  18.     detail_list = []
  19.     for i in url:
  20.         # print(i)
  21.         res = requests.get(base_url + i).text
  22.         content = BeautifulSoup(res, "html.parser")
  23.         name_box = content.find('div', attrs={'class''name-box'})
  24.         name = name_box.h1.text
  25.         hero_attr = content.find('div', attrs={'class''attr-list'})
  26.         attr_star = hero_attr.find_all('span')
  27.         survivability = attr_star[0]['class'][1].split('-')[1]
  28.         attack_damage = attr_star[1]['class'][1].split('-')[1]
  29.         skill_effect = attr_star[2]['class'][1].split('-')[1]
  30.         getting_started = attr_star[3]['class'][1].split('-')[1]
  31.         details = content.find('div', attrs={'class''otherinfo-datapanel'})
  32.         # print(details)
  33.         attrs = details.find_all('p')
  34.         attr_list = []
  35.         for attr in attrs:
  36.             attr_list.append(attr.text.split(':')[1].strip())
  37.         detail_list.append([name, survivability, attack_damage,
  38.                             skill_effect, getting_started, attr_list])
  39.     print('finish get details')
  40.     return detail_list
  41. def save_tocsv(details):
  42.     print('start save to csv')
  43.     with open('all_hero_init_attr_new.csv''w', encoding='gb18030'as f:
  44.         f.write('英雄名字,生存能力,攻击伤害,技能效果,上手难度,最大生命,最大法力,物理攻击,'
  45.                 '法术攻击,物理防御,物理减伤率,法术防御,法术减伤率,移速,物理护甲穿透,法术护甲穿透,攻速加成,暴击几率,'
  46.                 '暴击效果,物理吸血,法术吸血,冷却缩减,攻击范围,韧性,生命回复,法力回复\n')
  47.         for i in details:
  48.             try:
  49.                 rowcsv = '{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}'.format(
  50.                     i[0], i[1], i[2], i[3], i[4], i[5][0], i[5][1], i[5][2], i[5][3], i[5][4], i[5][5],
  51.                     i[5][6], i[5][7], i[5][8], i[5][9], i[5][10], i[5][11], i[5][12], i[5][13], i[5][14], i[5][15],
  52.                     i[5][16], i[5][17], i[5][18], i[5][19], i[5][20]
  53.                 )
  54.                 f.write(rowcsv)
  55.                 f.write('\n')
  56.             except:
  57.                 continue
  58.     print('finish save to csv')
  59. if __name__ == "__main__":
  60.     get_hero_url()
  61.     hero_url = get_hero_url()
  62.     details = get_details(hero_url)
  63.     save_tocsv(details)

好了,今天先分享这三个网站,咱们后面再慢慢分享更多好的练手网站与实战代码!

对于初学者想更轻松的学好Python开发,爬虫技术,Python数据分析,人工智能等技术,这里也给大家准备了一套系统学习资源

文中所展示的资料全部都是免费分享,点击下方链接添加微信即可免费获取!

戳这里

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/776627
推荐阅读
相关标签