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) 


返回 大数据分析