Python爬虫入门教程!手把手教会你爬取网页数据_python爬取网页数据

发送 POST 请求

对于 POST 请求,一般就是提交一个表单

r = requests.post('http://www.xxxx.com', data={"key": "value"}) 

data 当中,就是需要传递的表单信息,是一个字典类型的数据。

header 增强

对于有些网站,会拒绝掉没有携带 header 的请求的,所以需要做一些 header 增强。比如:UA,Cookie,host 等等信息。

header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36", 
         "Cookie": "your cookie"} 
res = requests.get('http://www.xxx.com', headers=header) 

解析 HTML

现在我们已经获取到了网页返回的数据,即 HTML 代码,下面就需要解析 HTML,来提取其中有效的信息。

BeautifulSoup

BeautifulSoup 是 Python 的一个库,最主要的功能是从网页解析数据。

from bs4 import BeautifulSoup  # 导入 BeautifulSoup 的方法 
# 可以传入一段字符串,或者传入一个文件句柄。一般都会先用 requests 库获取网页内容,然后使用 soup 解析。 
soup = BeautifulSoup(html_doc,'html.parser')  # 这里一定要指定解析器,可以使用默认的 html,也可以使用 lxml。 
print(soup.prettify())  # 按照标准的缩进格式输出获取的 soup 内容。 

BeautifulSoup 的一些简单用法

print(soup.title)  # 获取文档的 title 
print(soup.title.name)  # 获取 title 的 name 属性 
print(soup.title.string)  # 获取 title 的内容 
print(soup.p)  # 获取文档中第一个 p 节点 
print(soup.p['class'])  # 获取第一个 p 节点的 class 内容 
print(soup.find_all('a'))  # 获取文档中所有的 a 节点,返回一个 list 
print(soup.find_all('span', attrs={'style': "color:#ff0000"}))  # 获取文档中所有的 span 且 style 符合规则的节点,返回一个 list 

具体的用法和效果,我会在后面的实战中详细说明。

XPath 定位

XPath 是 XML 的路径语言,是通过元素和属性进行导航定位的。几种常用的表达式

表达式含义node选择 node 节点的所有子节点/从根节点选取//选取所有当前节点.当前节点…父节点@属性选取text()当前路径下的文本内容

一些简单的例子

xpath('node')  # 选取 node 节点的所有子节点 
xpath('/div')  # 从根节点上选取 div 元素 
xpath('//div')  # 选取所有 div 元素 
xpath('./div')  # 选取当前节点下的 div 元素 
xpath('//@id')  # 选取所有 id 属性的节点 

当然,XPath 非常强大,但是语法也相对复杂,不过我们可以通过 Chrome 的开发者工具来快速定位到元素的 xpath,如下图
在这里插入图片描述
得到的 xpath 为

//*[@id="anony-nav"]/div[1]/ul/li[1]/a 

在实际的使用过程中,到底使用 BeautifulSoup 还是 XPath,完全取决于个人喜好,哪个用起来更加熟练方便,就使用哪个。

爬虫实战:爬取豆瓣海报

我们可以从豆瓣影人页,进入都影人对应的影人图片页面,比如以刘涛为例子,她的影人图片页面地址为

  • [https://movie.douban.com/celebrity/1011562/photos/]
    在这里插入图片描述
    下面我们就来分析下这个网页
目标网站页面分析

注意:网络上的网站页面构成总是会变化的,所以这里你需要学会分析的方法,以此类推到其他网站。正所谓授人以鱼不如授人以渔,就是这个原因。

Chrome 开发者工具

Chrome 开发者工具(按 F12 打开),是分析网页的绝佳利器,一定要好好使用。

我们在任意一张图片上右击鼠标,选择“检查”,可以看到同样打开了“开发者工具”,而且自动定位到了该图片所在的位置
在这里插入图片描述
可以清晰的看到,每张图片都是保存在 li 标签中的,图片的地址保存在 li 标签中的 img 中。

知道了这些规律后,我们就可以通过 BeautifulSoup 或者 XPath 来解析 HTML 页面,从而获取其中的图片地址。

代码编写

我们只需要短短的几行代码,就能完成图片 url 的提取

import requests 
from bs4 import BeautifulSoup  
 
url = 'https://movie.douban.com/celebrity/1011562/photos/' 
res = requests.get(url).text 
content = BeautifulSoup(res, "html.parser") 
data = content.find_all('div', attrs={'class': 'cover'}) 
picture_list = [] 
for d in data: 
    plist = d.find('img')['src'] 
    picture_list.append(plist) 
print(picture_list) 
>>> 
['https://img1.doubanio.com/view/photo/m/public/p2564834267.jpg', 'https://img1.doubanio.com/view/photo/m/public/p860687617.jpg', 'https://img1.doubanio.com/view/photo/m/public/p2174001857.jpg', 'https://img1.doubanio.com/view/photo/m/public/p1563789129.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2363429946.jpg', 'https://img1.doubanio.com/view/photo/m/public/p2382591759.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2363269182.jpg', 'https://img1.doubanio.com/view/photo/m/public/p1959495269.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2356638830.jpg', 'https://img3.doubanio.com/view/photo/m/public/p1959495471.jpg', 'https://img3.doubanio.com/view/photo/m/public/p1834379290.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2325385303.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2361707270.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2325385321.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2196488184.jpg', 'https://img1.doubanio.com/view/photo/m/public/p2186019528.jpg', 'https://img1.doubanio.com/view/photo/m/public/p2363270277.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2325240501.jpg', 'https://img1.doubanio.com/view/photo/m/public/p2258657168.jpg', 'https://img1.doubanio.com/view/photo/m/public/p2319710627.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2319710591.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2311434791.jpg', 'https://img1.doubanio.com/view/photo/m/public/p2363270708.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2258657185.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2166193915.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2363265595.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2312085755.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2311434790.jpg', 'https://img3.doubanio.com/view/photo/m/public/p2276569205.jpg', 'https://img1.doubanio.com/view/photo/m/public/p2165332728.jpg'] 

可以看到,是非常干净的列表,里面存储了海报地址。

但是这里也只是一页海报的数据,我们观察页面发现它有好多分页,如何处理分页呢。
在这里插入图片描述

分页处理

我们点击第二页,看看浏览器 url 的变化

发现浏览器 url 增加了几个参数

再点击第三页,继续观察 url

通过观察可知,这里的参数,只有 start 是变化的,即为变量,其余参数都可以按照常理来处理

同时还可以知道,这个 start 参数应该是起到了类似于 page 的作用,start = 30 是第二页,start = 60 是第三页,依次类推,最后一页是 start = 420。

于是我们处理分页的代码也呼之欲出了

首先将上面处理 HTML 页面的代码封装成函数

def get_poster_url(res): 
    content = BeautifulSoup(res, "html.parser") 
    data = content.find_all('div', attrs={'class': 'cover'}) 
    picture_list = [] 
    for d in data: 
        plist = d.find('img')['src'] 
        picture_list.append(plist) 
    return picture_list 

然后我们在另一个函数中处理分页和调用上面的函数

def fire(): 
    page = 0 
    for i in range(0, 450, 30): 
        print("开始爬取第 %s 页" % page) 
        url = 'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i) 
        res = requests.get(url).text 
        data = get_poster_url(res) 
        page += 1 

此时,我们所有的海报数据都保存在了 data 变量中,现在就需要一个下载器来保存海报了

def download_picture(pic_l): 
    if not os.path.exists(r'picture'): 
        os.mkdir(r'picture') 
    for i in pic_l: 
        pic = requests.get(i) 
        p_name = i.split('/')[7] 
        with open('picture\\' + p_name, 'wb') as f: 
            f.write(pic.content) 

再增加下载器到 fire 函数,此时为了不是请求过于频繁而影响豆瓣网的正常访问,设置 sleep time 为1秒

def fire(): 
    page = 0 
    for i in range(0, 450, 30): 
        print("开始爬取第 %s 页" % page) 
        url = 'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i) 
        res = requests.get(url).text 
        data = get_poster_url(res) 
        download_picture(data) 
        page += 1 
        time.sleep(1) 

下面就执行 fire 函数,等待程序运行完成后,当前目录下会生成一个 picture 的文件夹,里面保存了我们下载的所有海报
在这里插入图片描述

核心代码讲解

下面再来看下完整的代码

import requests 
from bs4 import BeautifulSoup 
import time 
import osdef fire(): 
    page = 0 
    for i in range(0, 450, 30): 
        print("开始爬取第 %s 页" % page) 
        url = 'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i) 
        res = requests.get(url).text 
        data = get_poster_url(res) 
        download_picture(data) 
        page += 1 
        time.sleep(1)def get_poster_url(res): 
    content = BeautifulSoup(res, "html.parser") 
    data = content.find_all('div', attrs={'class': 'cover'}) 
    picture_list = [] 
    for d in data: 
        plist = d.find('img')['src'] 
        picture_list.append(plist) 
    return picture_listdef download_picture(pic_l): 
    if not os.path.exists(r'picture'): 
        os.mkdir(r'picture') 
    for i in pic_l: 
        pic = requests.get(i) 
        p_name = i.split('/')[7] 
        with open('picture\\' + p_name, 'wb') as f: 


如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费**学习**大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。



### 一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。



![](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)

### 二、学习软件



工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。



![](https://img-blog.csdnimg.cn/img_convert/8c4513c1a906b72cbf93031e6781512b.png)



### 三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

![](https://img-blog.csdnimg.cn/img_convert/eec417a3d4d977b313558a11d3c13e43.png)



### 四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。



![](https://img-blog.csdnimg.cn/img_convert/ec690501ea1dbe2cb209cbf4013c2477.png)  

![](https://img-blog.csdnimg.cn/img_convert/3eaeaa6747419c9d86c72e0d10d0a6a2.png)



### 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。



![](https://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png)



### 五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

![](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png)

成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里无偿获取](https://bbs.csdn.net/topics/618317507)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的Python爬虫爬取网页数据并解析数据教程: 1. 确定目标网站和要爬取的信息 首先,需要确定要爬取的网站和要提取的信息。可以使用Python的requests库向网站发送HTTP请求获取HTML源代码,并使用BeautifulSoup库解析HTML文档获取目标数据。 例如,我们要爬取CSDN博客的文章标题和链接,可以先打开CSDN博客主页,右键查看网页源代码,找到文章标题和链接所在的HTML标签。 2. 发送HTTP请求获取HTML源代码 接下来,使用Python的requests库向网站发送HTTP请求,获取HTML源代码。 ``` import requests url = 'https://blog.csdn.net/' response = requests.get(url) html = response.text ``` 3. 解析HTML文档获取目标数据 使用BeautifulSoup库解析HTML文档,获取目标数据。 ``` from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'html.parser') titles = soup.find_all('div', class_='title') for title in titles: link = title.find('a').get('href') title_text = title.find('a').text.strip() print(title_text, link) ``` 上述代码中,通过`find_all`方法找到所有class属性为"title"的div标签,然后在每个div标签中找到第一个a标签,获取链接和标题文本。 4. 完整代码 ``` import requests from bs4 import BeautifulSoup url = 'https://blog.csdn.net/' response = requests.get(url) html = response.text soup = BeautifulSoup(html, 'html.parser') titles = soup.find_all('div', class_='title') for title in titles: link = title.find('a').get('href') title_text = title.find('a').text.strip() print(title_text, link) ``` 以上就是一个简单的Python爬虫爬取网页数据并解析数据教程。需要注意的是,在爬取网站数据时要遵守网站的爬虫协议,避免被网站封禁IP。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值