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

其实在当今社会,网络上充斥着大量有用的数据,我们只需要耐心的观察,再加上一些技术手段,就可以获取到大量的有价值数据。这里的”技术手段”就是网络爬虫。今天就给大家分享一篇爬虫基础知识和入门教程:

什么是爬虫?

爬虫就是自动获取网页内容的程序,例如搜索引擎,Google,Baidu 等,每天都运行着庞大的爬虫系统,从全世界的网站中爬虫数据,供用户检索时使用。

爬虫流程

其实把网络爬虫抽象开来看,它无外乎包含如下几个步骤

  • 模拟请求网页。模拟浏览器,打开目标网站。
  • 获取数据。打开网站之后,就可以自动化的获取我们所需要的网站数据。
  • 保存数据。拿到数据之后,需要持久化到本地文件或者数据库等存储设备中。

那么我们该如何使用 Python 来编写自己的爬虫程序呢,在这里我要重点介绍一个 Python 库:Requests。

Requests 使用

Requests 库是 Python 中发起 HTTP 请求的库,使用非常方便简单。

模拟发送 HTTP 请求

发送 GET 请求

当我们用浏览器打开豆瓣首页时,其实发送的最原始的请求就是 GET 请求

import requests
res = requests.get('http://www.douban.com')
print(res)
print(type(res))
>>>

可以看到,我们得到的是一个 Response 对象

如果我们要获取网站返回的数据,可以使用 text 或者 content 属性来获取

text:是以字符串的形式返回数据

content:是以二进制的方式返回数据

print(type(res.text))
print(res.text)
>>>

.....

发送 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"}

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

2020-10-25 14:56·数据分析不是个事儿

其实在当今社会,网络上充斥着大量有用的数据,我们只需要耐心的观察,再加上一些技术手段,就可以获取到大量的有价值数据。这里的”技术手段”就是网络爬虫。今天就给大家分享一篇爬虫基础知识和入门教程:

什么是爬虫?

爬虫就是自动获取网页内容的程序,例如搜索引擎,Google,Baidu 等,每天都运行着庞大的爬虫系统,从全世界的网站中爬虫数据,供用户检索时使用。

爬虫流程

其实把网络爬虫抽象开来看,它无外乎包含如下几个步骤

  • 模拟请求网页。模拟浏览器,打开目标网站。
  • 获取数据。打开网站之后,就可以自动化的获取我们所需要的网站数据。
  • 保存数据。拿到数据之后,需要持久化到本地文件或者数据库等存储设备中。

那么我们该如何使用 Python 来编写自己的爬虫程序呢,在这里我要重点介绍一个 Python 库:Requests。

Requests 使用

Requests 库是 Python 中发起 HTTP 请求的库,使用非常方便简单。

模拟发送 HTTP 请求

发送 GET 请求

当我们用浏览器打开豆瓣首页时,其实发送的最原始的请求就是 GET 请求

import requests
res = requests.get('http://www.douban.com')
print(res)
print(type(res))
>>>
<response [200]>
<class 'requests.models.response'>
</class 'requests.models.response'></response [200]>

可以看到,我们得到的是一个 Response 对象

如果我们要获取网站返回的数据,可以使用 text 或者 content 属性来获取

text:是以字符串的形式返回数据

content:是以二进制的方式返回数据

print(type(res.text))
print(res.text)
>>>
<class 'str'>&#xA0;<!DOCTYPE HTML>
<html lang="zh-cmn-hans" class="">
<head>
<meta charset="utf-8">
<meta name="google-site-verification" content="ok0wcgt20tbbgo9_zat2iacimtn4ftf5ccsh092xeyw" >
<meta name="description" content="提供图书、电影、音乐唱片的推荐、评论和价格比较,以及城市独特的文化生活。">
<meta name="keywords" content="豆瓣,广播,登陆豆瓣">.....

</meta name="keywords" content="豆瓣,广播,登陆豆瓣"></meta name="description" content="提供图书、电影、音乐唱片的推荐、评论和价格比较,以及城市独特的文化生活。"></meta name="google-site-verification" content="ok0wcgt20tbbgo9_zat2iacimtn4ftf5ccsh092xeyw" ></meta charset="utf-8"></head></html lang="zh-cmn-hans" class=""></class 'str'>

发送 POST 请求

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

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

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

header 增强

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

header&#xA0;=&#xA0;{"User-Agent":&#xA0;"Mozilla/5.0&#xA0;(Windows&#xA0;NT&#xA0;10.0;&#xA0;Win64;&#xA0;x64)&#xA0;AppleWebKit/537.36&#xA0;(KHTML,&#xA0;like&#xA0;Gecko)&#xA0;Chrome/76.0.3809.100&#xA0;Safari/537.36",
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;"Cookie":&#xA0;"your&#xA0;cookie"}
res&#xA0;=&#xA0;requests.get('http://www.xxx.com',&#xA0;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,如下图

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

得到的 xpath 为

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

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

爬虫实战:爬取豆瓣海报

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

https://movie.douban.com/celebrity/1011562/photos/

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

下面我们就来分析下这个网页

目标网站页面分析

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

Chrome 开发者工具

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

我们在任意一张图片上右击鼠标,选择”检查”,可以看到同样打开了”开发者工具”,而且自动定位到了该图片所在的位置

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

可以清晰的看到,每张图片都是保存在 li 标签中的,图片的地址保存在 li 标签中的 img 中。

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

代码编写

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

import&#xA0;requests
from&#xA0;bs4&#xA0;import&#xA0;BeautifulSoup&#xA0;

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

可以看到,是非常干净的列表,里面存储了海报地址。
但是这里也只是一页海报的数据,我们观察页面发现它有好多分页,如何处理分页呢。

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

分页处理

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

https://movie.douban.com/celebrity/1011562/photos/?type=C&start=30&sortby=like&size=a&subtype=a

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

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

https://movie.douban.com/celebrity/1011562/photos/?type=C&start=60&sortby=like&size=a&subtype=a

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

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

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

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

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

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

def&#xA0;fire():
&#xA0;&#xA0;&#xA0;&#xA0;page&#xA0;=&#xA0;0
&#xA0;&#xA0;&#xA0;&#xA0;for&#xA0;i&#xA0;in&#xA0;range(0,&#xA0;450,&#xA0;30):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;print("&#x5F00;&#x59CB;&#x722C;&#x53D6;&#x7B2C;&#xA0;%s &#x9875;"&#xA0;%&#xA0;page)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;url&#xA0;=&#xA0;'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;res&#xA0;=&#xA0;requests.get(url).text
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;data&#xA0;=&#xA0;get_poster_url(res)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;page&#xA0;+=&#xA0;1

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

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

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

def&#xA0;fire():
&#xA0;&#xA0;&#xA0;&#xA0;page&#xA0;=&#xA0;0
&#xA0;&#xA0;&#xA0;&#xA0;for&#xA0;i&#xA0;in&#xA0;range(0,&#xA0;450,&#xA0;30):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;print("&#x5F00;&#x59CB;&#x722C;&#x53D6;&#x7B2C;&#xA0;%s &#x9875;"&#xA0;%&#xA0;page)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;url&#xA0;=&#xA0;'https://movie.douban.com/celebrity/1011562/photos/?type=C&start={}&sortby=like&size=a&subtype=a'.format(i)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;res&#xA0;=&#xA0;requests.get(url).text
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;data&#xA0;=&#xA0;get_poster_url(res)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;download_picture(data)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;page&#xA0;+=&#xA0;1
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;time.sleep(1)

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

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

核心代码讲解

下面再来看下完整的代码

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

fire 函数

这是一个主执行函数,使用 range 函数来处理分页。

  • range 函数可以快速的创建整数列表,在 for 循环时及其好用。函数中的0代表从0开始计数,450代表一直迭代到450,不包含450,30代表步长,即每次递增的数字间隔。range(0, 450, 30),依次会输出:0,30,60,90 …

  • format 函数,是一种字符串格式化方式

  • time.sleep(1) 即为暂停1秒钟

get_poster_url 函数

这个就是解析 HTML 的函数,使用的是 BeautifulSoup

  • 通过 find_all 方法查找所有 class 为 “cover” 的 div 元素,返回的是一个列表
  • 使用 for 循环,循环上一步拿到的列表,取出 src 的内容,append 到列表中
  • append 是列表的一个方法,可以在列表后面追加元素

download_picture 函数

简易图片下载器

  • 首先判断当前目录下是否存在 picture 文件夹,os.path.exists
  • os 库是非常常用用来操作系统相关的命令库,os.mkdir 就是创建文件夹
  • split 用于切割字符串,取出角标为7的元素,作为存储图片的名称
  • with 方法用来快速打开文件,打开的进程可以自行关闭文件句柄,而不再需要手动执行 f.close() 关闭文件

总结

本节讲解了爬虫的基本流程以及需要用到的 Python 库和方法,并通过一个实际的例子完成了从分析网页,到数据存储的全过程。其实爬虫,无外乎模拟请求,解析数据,保存数据。

当然有的时候,网站还会设置各种反爬机制,比如 cookie 校验,请求频度检查,非浏览器访问限制,JS 混淆等等,这个时候就需要用到反反爬技术了,比如抓取 cookie 放到 headers 中,使用代理 IP 访问,使用 Selenium 模拟浏览器等待方式。

由于本课程不是专门的爬虫课,这些技能就留待你自己去探索挖掘啦。

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

作为过来人,跟大家聊一聊我的自学心得,希望可以帮助大家少走弯路,少踩坑。

更多Python、爬虫、人工智能配套视频教程+书籍可以+v 免费领取。

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

对方向选择、学习规划、学习路线、职业发展方面有问题的可以加群:809160367

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

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

Original: https://blog.csdn.net/m0_60721065/article/details/120282581
Author: 计算机视觉农民工
Title: Python爬虫入门教程!手把手教会你爬取网页数据

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/671013/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • libc and libc++

    人工智能 2023年5月26日
    0118
  • AutoDL-GPU租用平台使用教程

    AutoDL是一个国内的GPU租用平台,最近使用了一下,体验感还是很nice的,所以写了篇博客来介绍一下该平台的具体使用方式,也可以当做一个教程来学习^_^ 网址:AutoDL-品…

    人工智能 2023年7月4日
    0104
  • vscode配置opencv

    前言 本篇文章主要用来记录使用vscode配置opencv的全过程,在整个过程中需要用到的工具包括vscode安装包、MinGW-w64和opencv的源码。vs studio配置…

    人工智能 2023年6月18日
    092
  • Deformable DETR源码解读

    文章目录 一:网络创新点 二:流程详解 【part 1】deformable_detr模块 * 【part 2】deformable_transformer模块 – +…

    人工智能 2023年6月23日
    088
  • 视觉检测缺陷——YOLOv5+Deepsort+Pyqt5应用于流水线产品计数及错漏反检测问题

    一、背景 在工厂里面,流水线上产品经常出现”错漏反”的问题或者产品外观出现瑕疵。(错:指的是产品零件、产品型号、包装配件等装错、放错等问题;漏:指的是漏放产…

    人工智能 2023年7月10日
    075
  • C. Cyclic Permutations(组合数学+单峰序列)

    Problem – 1391C – Codeforces 题意: 一个长度为n的排列是由1到n的n个不同的整数按任意顺序组成的数组。例如,[2,3,1,5,…

    人工智能 2023年6月28日
    0116
  • 事件抽取综述

    事件抽取综述 1 基本概念 * 1.1 事件 1.2 事件抽取 2 国内外研究现状 3 语料库 * 3.1 ACE事件语料库 3.2 MUC语料库 3.3 TDT语料库 3.4 K…

    人工智能 2023年5月30日
    083
  • MySQL事务隔离级别

    MySQL的四种隔离级别 读未提交 读提交 可重复读 串行化 隔离级别可以通过MySQL的视图来实现。 读未提交 读未提交是一个事务仅修改了数据但还未提交时,本次修改可以便可被其他…

    人工智能 2023年6月27日
    088
  • Python实现一元及多元线性回归

    Python实现线性回归 实现目标 实验数据 结果分析 * 数据集1下的回归分析 数据集2下的回归分析 源代码 实现目标 1.实现一元(或多元)线性回归a. 根据对客观现象的定性认…

    人工智能 2023年6月18日
    090
  • 混淆矩阵 (Confusion Matrix)

    假设现在有一个分类器A,这个分类器A的作用是告诉一张图片是不是汉堡,那我想知道这个分类器A的效果好不好,应该怎么办呢? 最简单的方法是将大量的样本放进到费雷其A当中,让他自己判断这…

    人工智能 2023年6月23日
    0102
  • R语言使用complete.cases函数筛选出dataframe中不包含缺失值的所有数据行(select rows not have missing values)

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

    人工智能 2023年7月17日
    072
  • 模型部署时需要考虑哪些性能指标

    问题概述 在模型部署阶段,我们需要考虑哪些性能指标来评估模型的性能? 介绍 模型部署是将训练好的模型应用于实际生产环境的过程。为了评估模型的性能,我们需要考虑一些性能指标来衡量模型…

    人工智能 2024年1月4日
    052
  • MXNet对分布式推理(Inference)有何支持

    MXNet对分布式推理的支持 MXNet是一个高性能深度学习框架,支持在分布式环境下进行模型训练和推理。分布式推理(Inference)是指将模型应用于实际数据并生成预测结果的过程…

    人工智能 2024年1月1日
    075
  • fine-tuning(微调)的理解

    fine-tuning 介绍 * 什么情况下使用微调 微调指导事项 不同数据集下使用微调 涉及到的其他知识 * 学习率(learning-rate) 卷积神经网络的核心 迁移学习与…

    人工智能 2023年7月26日
    073
  • 机器学习-对数几率回归

    目录 前言 一、对数几率回归的机器学习三要素 二、对数几率回归 2.1 算法原理 2.1.1 广义线性模型 2.1.2 对数几率回归 2.2 利用极大似然估计推导损失函数 2.2….

    人工智能 2023年6月18日
    0106
  • 链表的带环问题

    链表带环问题 一,判断链表是否带环 二,求入环结点 * 1,链表相交问题 2,法一 3,法二 带环问题,是链表众多问题中一类经典的问题,下面我们就来深度剖析一下链表的带环问题。 一…

    人工智能 2023年6月29日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球