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

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

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

我知道网上有不少的爬虫教学,我以前本身也去网上看,可是好像每个都不一样,并且好像都很高级,后来仍是别人教我去抓取网页或是节点,这和我在网上看到的其余爬取的方法都不同,毕竟网上的都很高级,我只是一个小白。 今天演示的是爬取豆瓣电影Top250的电影及其导演和引言。 爬虫分为三步: 一、获取网页 二、解析网页 三、提取信息 四、数据处理 注:如下操做都是在谷歌浏览器进行前端

那么进行这个以前,你的电脑先要有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做为例子) 在这里插入图片描述 安装完以后就能够呈上代码了,先导入库。python

import requests
from bs4 import BeautifulSoup
复制代码

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


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!成功响应!markdown


2.解析网页


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

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

第一行是防止乱码的状况,因此就加入了encoding="utf-8" (PS:你们也尽可能避开英文的名字,否则也可能出现乱码的状况) 第二行就是解析网页了。 第二步结束啦啦啦啦!!!很快吧!嘻嘻app


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 咱们能够发现大部分元素都是同样的,可是有个别元素不一样,那么咱们就能够将不一样元素的都去除掉,留下相同元素,就能够进行相关节点的抓取 就会有如下的代码python爬虫

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不能用了,就用手机热点试试,结果就又能够了。

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

相关文章
相关标签/搜索