小白喜提python爬虫~看完即会,大神请绕路或是莅临指导!!

449 阅读8分钟

这是我参与8月更文挑战的第 11 天,活动详情查看:8月更文挑战

利用requests库进行静态页面的爬取之豆瓣Top250

我知道网上有很多的爬虫教学,我之前自己也去网上看,但是好像每一个都不同,而且好像都很高级,后来还是别人教我去抓取网页或是节点,这和我在网上看到的其他爬取的方法都不一样,毕竟网上的都很高级,我只是一个小白。 今天演示的是爬取豆瓣电影Top250的电影及其导演和引言。 爬虫分为三步: 1、获取网页 2、解析网页 3、提取信息 4、数据处理 注:以下操作都是在谷歌浏览器进行

那么进行这个之前,你的电脑先要有requests和bs4这两个库。 这里有个小建议呀,如果你直接pip install xxx是很慢的,很痛苦,因为这是在国外的。 在国内的话,你也可以用豆瓣源 ①pip install -i pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn xxx(清华提供的python的各种库) ②pypi.douban.com/simple/(豆瓣提… ps:网上好多人建议用豆瓣源emmmmm,但是我没有,我一只都是用第一种的。 下面就直接演示用第一种方法,就直接复制就行了,然后在xxx的地方换上所装的库,当然有时也会翻车,尝试多几次就行了,比直接pip install xxx是要好很多的! 在这里插入图片描述 如果没有红色出现,并且像下面这个样子的时候就是完成了(之前安装了requests和bs4,我就只是拿装个ipython作为例子) 在这里插入图片描述 安装完之后就可以呈上代码了,先导入库。

import requests
from bs4 import BeautifulSoup

敲黑板,划重点!BeautifulSoup有解析网页的作用!


1.获取网页

第一步有点繁琐,希望大家有点耐心,后面就很快了!


如果是要获取网页,我们就先了解这个网页嘛,观察这个网页是动态还是静态,那么今天先是以豆瓣电影Top250的页面开刀 先到豆瓣电影Top250的页面。 在这里插入图片描述 因为这是静态的文本,所以就是可以直接在网页代码上面找到相关内容 在这里插入图片描述 那么上面箭头的部分就是我们所要爬取到内容。 由于爬虫需要有请求头,所以我们要先找到请求头 那么下面提供一种懒人请求头的方法。 还是以豆瓣网址为例: 1.按下F12,找到NetWork,然后看到name那边,当然第一次进去是空的,那么可以先刷新一下就可以有了。 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 看到头部分,然后将其curl(base)部分复制下来 在这里插入图片描述 然后到python爬虫懒人请求头方法 在这里插入图片描述 呈上代码:

import requests

cookies = {
    'bid': 'rmK1EcA3r2s',
    'douban-fav-remind': '1',
    'll': '108307',
    '__yadk_uid': 'EJwuEzTIVazCD6p6x1iHue85SnWjRlB5',
    '_vwo_uuid_v2': 'D34D2B043520CA650F6C4DC668A88DA31|597fb0686dd33356e891115ef92a29ba',
    '__gads': 'ID=63dfd78ef423c877:T=1580267930:S=ALNI_MZzMqVe3mnbI1vr-EzQAwwxmvaC5A',
    'ct': 'y',
    '__utmz': '30149280.1581656678.9.4.utmcsr=baidu|utmccn=(organic)|utmcmd=organic',
    '_pk_ref.100001.4cf6': '%5B%22%22%2C%22%22%2C1582597634%2C%22https%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3D%25E8%25B1%2586%25E7%2593%25A3%26rsv_spt%3D1%26rsv_iqid%3D0xad5f1d05001c7050%26issp%3D1%26f%3D8%26rsv_bp%3D1%26rsv_idx%3D2%26ie%3Dutf-8%26tn%3D62095104_36_oem_dg%26rsv_enter%3D1%26rsv_dl%3Dtb%26rsv_sug2%3D0%26inputT%3D1216%26rsv_sug4%3D1779%22%5D',
    '_pk_ses.100001.4cf6': '*',
    'ap_v': '0,6.0',
    '__utma': '30149280.2011140489.1580267903.1581656678.1582597635.10',
    '__utmc': '30149280',
    '__utmb': '223695111.0.10.1582597635',
    '_pk_id.100001.4cf6': '6057282de3ce6902.1580267911.8.1582598700.1581658464.',
    '__utmt_douban': '1',
}

headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.16 Safari/537.36',
    'Sec-Fetch-User': '?1',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'navigate',
    'Referer': 'https://movie.douban.com/chart',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9',
}

response = requests.get('https://movie.douban.com/top250', headers=headers, cookies=cookies)

那么第一步获取网页就完成了! requests.get就是获取到这个网页了!你可以吧response的出来看看。 在这里插入图片描述 响应200!成功响应!


2.解析网页


那么这一步就要用到BeautifulSoup了!

response.encoding='utf-8'
soup = BeautifulSoup(response.text, 'html.parser')

第一行是防止乱码的情况,所以就加入了encoding="utf-8" (PS:大家也尽量避开英文的名字,不然也可能出现乱码的情况) 第二行就是解析网页了。 第二步结束啦啦啦啦!!!很快吧!嘻嘻


3.提取信息


在这里插入图片描述 在这里插入图片描述 但是注意了,这样复制下来仅仅只是复制了一个电影题目而已,就单单是《肖申克的救赎》这一个点而已,那么了解过前端的同学呢都知道这些排版都是有规律的,不然就会显得没有逻辑可寻。 我们可以把两个标题都给复制下来,就会有以下结果: 《肖申克的救赎》 #content > div > div.article > ol > li:nth-child(1) > div > div.info > div.hd > a > span:nth-child(1) 《霸王别姬》 #content > div > div.article > ol > li:nth-child(2) > div > div.info > div.hd > a > span.title 我们可以发现大部分元素都是一样的,但是有个别元素不同,那么我们就可以将不同元素的都去除掉,留下相同元素,就可以进行相关节点的抓取 就会有以下的代码

title = "#content > div > div.article > ol > li > div > div.info > div.hd > a"

那么其他的元素(电影导演,电影引言)节点也是这样的啦! 在这里插入图片描述 记得不是点中文那里,是点那些英文那里才会有这个selector噢

dirtor = "#content > div > div.article > ol > li > div > div.info > div.bd > p:nth-child(1)"
quote='#content > div > div.article > ol > li > div > div.info > div.bd > p.quote'

那么第三部分提取元素就完成啦!!!嘻嘻~


4.数据的处理


我们要先将提取的元素进行分解。

    a=soup.select(title)
    b=soup.select(dirtor)
    c=soup.select(quote)

当然如果就直接将以上几个节点打出来的话,是有一些非汉字的东西的,比如说一些前端东西。 那么直接上.text就行了,就不需要用到正则表达式去截取字符串了。

a[i] = a[i].text
b[i] = b[i].text
c[i] = c[i].text

最后再直接打出来就行了。

print(" 电影名字 :{}\n 电影导演:{}\n 电影引言: {}\n ".format(a[i],b[i],c[i]),end="")

当然啦,现在其实只是完成十分之一,因为我们只是完成了第一页而已,还有剩下九页的内容。


附加部分.数据的完善


那么我们可以观察豆瓣网页,就可以发现,页数之间也是有规律的! 在这里插入图片描述 我们可以看到这个上面的start的变化(第二页) 下面的http那一行其实就是那个网页了嘛 在这里插入图片描述 我们可以看到这个上面的start的变化(第三页)

有木有!!xiongdei!25!50!规律就出来了,由于每个页面都是相似的,节点也是相似的,所以我们就可以进行其他的节点的抓取! 那么我们一个for循环就可以了!利用其字符串的拼接。

for k in range(0,10):
    i=k*25
    res = requests.get('https://movie.douban.com/top250?start='+str(i)+'&filter=', headers=headers)

这样就可以将十页的元素都提取出来了。 如何我们想将其放入本地的文件的话呢可以这样操作 要先导入os库

import os

打开一个文件

fo = open("豆瓣Movies Top250.txt",'a',encoding="utf-8")

将爬取的内容放入其中

fo.write(a[i])
fo.write(b[i])
fo.write(c[i])

关闭文件

fo.close()

完整代码展示

import os
import requests
from bs4 import BeautifulSoup
cookies = {
    'bid': 'E4gkXiSwBrM',
    'douban-fav-remind': '1',
    'll': '118088',
    '__yadk_uid': 'hkoioWDL1agCeIP3VyFfyXTl6SBJ1uf3',
}
headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'DNT': '1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
    'Sec-Fetch-User': '?1',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'navigate',
    'Referer': 'https://movie.douban.com/top250?start=225&filter=',
    'Accept-Encoding': '',
    'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7',
}
params = (
    ('start', '0'),
    ('filter', ''),
)
fo = open("豆瓣Movies Top250.txt",'a',encoding="utf-8")
for k in range(0,10):
    i=k*25
    response = requests.get('https://movie.douban.com/top250?start='+str(i)+'&filter=', headers=headers)
    response.encoding='utf-8'
    soup = BeautifulSoup(response.text, 'html.parser')
    title = "#content > div > div.article > ol > li > div > div.info > div.hd > a"
    dirtor = "#content > div > div.article > ol > li > div > div.info > div.bd > p:nth-child(1)"
    quote='#content > div > div.article > ol > li > div > div.info > div.bd > p.quote'
    a=soup.select(title)
    b=soup.select(dirtor)
    c=soup.select(quote)
    for i in range(0,len(a)):
        a[i] = a[i].text
        b[i] = b[i].text
        c[i] = c[i].text
        fo.write(a[i])
        fo.write(b[i])
        fo.write(c[i])
        print(" 电影名字 :{}\n 电影导演:{}\n 电影引言: {}\n ".format(a[i],b[i],c[i]),end="")
fo.close()

控制台效果: 在这里插入图片描述 文本效果: 在这里插入图片描述 在这里插入图片描述

但是关于这个爬取信息的排版我还不是很懂,所以就没进行排版的操作,所以就是这样的了。如果有大佬看到的话,可以指点一下吗。。。(估计大佬也不会看这种级别的。。)

分享一个我在爬虫当中的问题:就是我有一次爬虫的时候,第一次运行爬下来了,第二次就不行了,所爬取的网页也会有一个提示,说检查到啥啥啥的,不记得了,这就是反爬虫了,我也不懂怎么解决,我当时是觉得这个ip不能用了,就用手机热点试试,结果就又可以了。

这就是我的第一个爬虫,希望能帮到想学习的你,我也是一个小白,有什么地方错的或是你不理解的,也可以在下面说说,看到我也会回复的!嘻嘻~