Python爬取静态网页
来自CloudWiki
网站分析
本章实践项目的目的是获取豆瓣电影TOP250的所有电影的名称,网页地址为:https://movie.douban.com/top250。在此爬虫中,将请求头定制为实际浏览器的请求头。
第一页只有25个电影,如果要获取所有的250页电影,就需要获取总共10页的内容。通过单击第二页可以发现网页地址变成了:
https://movie.douban.com/top250?start=25 第三页的地址为:https://movie.douban.com/top250?start=50
,这就很容易理解了,每多一页,就给网页地址的start参数加上25。
源代码
初始版
利用函数get_movies获得豆瓣TOP250页面的
import requests def get_movies(): headers={ 'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64)AppleWobKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82Safari/537.36', 'Host': 'movie.douban.com' }#编制请求头 for i in range(0,10): link = 'https://movie.douban.com/top250?start=' + str(1 * 25) r = requests.get(link,headers, timeout=10)#如果服务器在timeout秒内没有应答,就返回异常。 print(str(i+1),"页响应状态码:",r.status_code)#打印页响应状态码 print(r.text)#打印网页 get_movies()
改进版
import requests from bs4 import BeautifulSoup def get_movies(): headers={ 'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64)AppleWobKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82Safari/537.36', 'Host': 'movie.douban.com' } movie_list = []#新建列表 for i in range(0,10): link = 'https://movie.douban.com/top250?start=' + str(1 * 25) r = requests.get(link,headers, timeout=10) print(str(i+1),"页响应状态码:",r.status_code) #print(r.text) #用BeautifulSoup解析网页 soup =BeautifulSoup(r.text,"html.parser") div_list = soup.find_all('div',class_= 'hd')#找到网页中所有属于hd类的div标签 for each in div_list: movie =each.a.span.text.strip()#找到每部电影的名字 movie_list.append(movie)#把每部电影的名字加到列表之中 return movie_list movies = get_movies() print(movies)#打印列表
练习
爬取Alexa上排名前1000的网页:http://www.alexa.cn/siterank
import requests from bs4 import BeautifulSoup import time num = 0 for i in range(1,51): r = requests.get('http://www.alexa.cn/siterank/' + str(i)) soup = BeautifulSoup(r.text, "html.parser") span_list = soup.find_all('span', class_ = 'domain-link') link_list = [(str(j + num), span_list[j].a['href']) for j in range(len(span_list))] num = num + len(link_list) output = "\n".join("%s\t%s" % tup for tup in link_list) + "\n" print (num) with open('alexa.txt', 'a+', encoding = 'utf-8') as f: f.write(output) f.close time.sleep(3)
返回 大数据分析