手把手Python3爬虫实战(1)——requests与Beautifulsoup的使用之爬虫获取豆瓣电影top250

requests与Beautifulsoup的使用之爬虫获取豆瓣电影top250

  • requests与Beautifulsoup简介
    • 安装
    • 功能简介
  • 本次的任务
  • 爬虫前的准备——网页分析
  • 具体代码
    • 一步步分析
    • 初级完整版——只访问一页
    • 最终完整版——多页连续访问并写入txt

本文适合稍微有一点基础的用户,在阅读本文前,你至少需要大致了解:
(1)python的基本语法
(2)python库的pip安装
(3)HTML标签相关
本文选用的python IDE为pycharm,python和pycharm的安装不在此文赘述。

requests与Beautifulsoup简介

安装

Windows+r打开cmd命令提示符,利用pip install 命令安装两个库即可。
具体安装命令如下:

pip install requests
pip install beautifulsoup4

回车即开始安装。
如果回车后为空则说明未安装pip模块,解决方法可以百度一下。
安装成功后在pycharm中新建一个文件输入

import requests
from bs4 import BeautifulSoup

若未出现红色下划线与报错信息则基本可以确定安装成功。

功能简介

个人理解:
requests库的作用就是模拟人去访问网页的动作,因此其包含了网页爬虫的基本方法,如获取网页内容、提交用户上传表单等等;
而Beautifulsoup库的作用就是模拟人访问网页得到信息的过程,最终目的是通过访问网页获得你想得到的信息。
总而言之,不太严谨的说,requests负责和网页交互,而beautifulsoup负责得到你想要的信息。

本次的任务

获取豆瓣电影top250的中文名称和其对应的排名并将其写入一个txt文件。
网址:豆瓣电影top250

爬虫前的准备——网页分析

目前来说,使用浏览器自带的开发调试工具进行分析即可,打开浏览器(本文用的chrome),按下F12或Fn+F12即可调出该工具,效果如下:
手把手Python3爬虫实战(1)——requests与Beautifulsoup的使用之爬虫获取豆瓣电影top250_第1张图片
我们要获得的是电影名,在网页的主体部分,所以应该关注body标签,将鼠标放到各个标签上,左边对应的部分就会变色,如下图:
手把手Python3爬虫实战(1)——requests与Beautifulsoup的使用之爬虫获取豆瓣电影top250_第2张图片
可以看出我们将鼠标放在了一个id为wrapper的div标签上右边对应的区域就会变色,可以发现电影名在这个区域内,于是我们层层展开标签,发现class名为hd的div标签就是最小的一个div标签了:
手把手Python3爬虫实战(1)——requests与Beautifulsoup的使用之爬虫获取豆瓣电影top250_第3张图片
然后我们只需要获取里面的这个div标签下的第一个span标签就是电影的中文名。
这样我们就找到了我们要找的信息,开始写代码。

具体代码

一步步分析

首先,我们直接用requests的get方法获取网站的状态码,看看结果:

import requests

url='https://movie.douban.com/top250'
data=requests.get(url).status_code
print(data)

输出结果为418,这说明网站存在反爬程序,因此我们需要加一个请求头来模拟浏览器访问,如下:

import requests

url='https://movie.douban.com/top250'
headers = {
     
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
    }
data=requests.get(url=url,headers=headers).status_code
print(data)

这里输出结果为200,表明成功访问。
将后面的status_code换成content再输出一遍试试。
在这里插入图片描述
发现输出了一堆不是人话的东西。
再改成

data=requests.get(url=url,headers=headers).content.decode()

手把手Python3爬虫实战(1)——requests与Beautifulsoup的使用之爬虫获取豆瓣电影top250_第4张图片
发现输出的是带标签的整个网页信息,那么怎么提取出其中的人话呢,这时候就需要beautifulsoup出场了。
首先先建立一个beautifulsoup对象:

page=requests.get(url=url,headers=headers).content
soup=BeautifulSoup(page)

根据前面的分析,要找class名为hd的div标签,且要找到这一页所有的这个标签,所以用find_all方法:

content=soup.find_all('div', class_="hd")

随后用一个循环读出每一个类名hd的div中的第一个span标签中的数据,并加上序号即可:

i=0
    for k in content:
        a=k.find_all('span')
        # print(a)
        i=i+1
        print(i,a[0].string)

初级完整版——只访问一页

import requests
from bs4 import BeautifulSoup

url='https://movie.douban.com/top250'

def download_page(url):
    headers = {
     
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
    }
    data=requests.get(url,headers=headers).content
    return data

if __name__=='__main__':
    # print(download_page(url).decode())
    soup=BeautifulSoup(download_page(url))
    # print(soup.prettify())
    content=soup.find_all('div', class_="hd")
    # print(content)
    print(soup.title.string)
    i=0
    for k in content:
        a=k.find_all('span')
        # print(a)
        i=i+1
        print(i,a[0].string)

最终完整版——多页连续访问并写入txt

多页连续访问:
观察每一页的网页url,发现第二页为

https://movie.douban.com/top250?start=25&filter=

因此第一页可看作start=0,第三页为start=50…以此类推,所以用一个循环实现了翻页(本质是访问了一组不同的网页):

for i in range(10):
    url = 'https://movie.douban.com/top250?start=' + str(i*25) + '&filter='

写入txt:
加入python文件操作,用open()方法打开文档,write()方法改写,close()方法关闭文档。

import requests
from bs4 import BeautifulSoup

f = open("文件位置路径\文件名.txt","w")
headers = {
     
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
    }

for i in range(10):
    url = 'https://movie.douban.com/top250?start=' + str(i*25) + '&filter='
    data = requests.get(url, headers=headers).content
    soup = BeautifulSoup(data)
    content = soup.find_all('div', class_="hd")
    # print(soup.title.string)
    j = 0
    for k in content:
        a = k.find_all('span')
        # print(a)
        j = j + 1
        print(j+25*i, a[0].string)
        f.write(str(j+25*i))
        f.write(" ")
        f.write(a[0].string)
        f.write("\n")
f.close()

你可能感兴趣的:(爬虫,爬虫,python)