大家好,今天给各位分享高效数据分析入门指南:数据采集技巧、Python爬虫实例解析及实操教程的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!
1.1 爬虫的前置知识
了解双标签的HTML结构,知道如何查看网页上的资源或抓包工具,更好地理解css和js。即使你是零基础也没关系。下面的案例讲解中会穿插相关知识。
1.2 准备工具
安装了python3,以及requests、lxml、beautifulsoup4、selenium、scripy三方包。
二:爬虫基础
2.1 基本套路
基本流程的目标数据是什么,要抓取哪些数据?源地址在哪里,从哪里爬取数据?你想要的数据是放在那些HTML结构中的吗?您如何进行数据提取? xpath、css选择、beautifulsoup提取、重新正则提取?基本手段破解请求限制请求头设置、模拟设置请求头控制请求频率(根据实际场景)、控制爬虫休眠(防止对目标网站进行DNS攻击)IP代理(防止反爬虫手段封堵您的网站) IP)签名/加密参数从HTML/cookie/js分析(网站需要验证信息)来破解登录授权请求并带上用户cookie信息来破解验证码。对于简单的验证码,可以使用第三方库读取验证码使用图像识别(自己训练验证码算法或者付费实现)解析数据xpath 、css 选择、beautifulsoup 提取、重新正则提取?
2.2 一个简单爬虫
import requests # 导入第三方包请求
url="http://www.baidu.com" # 给出访问地址
response=requests.get(url=url) #使用requests包进行请求访问
print(response.status_code) # 返回请求状态代码。 200表示访问成功。您可以直接同意响应来检查整体效果并检查状态码。
查看所有信息
百度网页对比
对比之后我们发现,两者的网页并不一样,不用担心,上面这个简单的爬虫只是想说明用python爬取代码是多么容易。只需三行代码即可构建一个爬虫。实际使用的爬虫可以参考诉求构造方法添加参数构造。
2.3 一些简单参数的添加
2.3.1 爬虫响应信息
代码含义response.json() 获取响应内容(json字符串) response.text 获取响应内容(字符串) response.content 获取响应内容(字节) response .headers获取响应头内容response.url 获取访问地址response.encoding 获取网页编码response.request.headers 请求头内容response.cookie 获取cookie
2.3.2 构造header
如今网站的反爬虫方法有很多,除了有些网站不做反爬行。除了攀爬措施外,大部分都做了反向攀爬。因此,我们需要给我们的爬虫添加各种参数,让网站认为这是用户在浏览内容,而不是爬虫在爬行内容。当然,随着如今法律的完善,爬虫也需要小心,不要爬取非法资源。您可以参考网站的/robots.txt查看哪些内容是不允许爬取的。这个还是要看一下,不然就会无缘无故的坐牢。
网页地址/robots.txtbilibili的robots.txt
好的,我们拨打构造我们的第一个参数,header。为什么我们需要设置header参数呢? header就是我们的浏览器在浏览时提交给网站服务器关于自身浏览器的信息,我们使用python作为爬虫的时候,给出的header是python,就会导致网站服务器直接识别出我们是爬虫。直拨不返回数据,或者返回错误数据。因此,header是我们爬虫要设置的第一个参数。
可以通过在浏览器中查看自己的标头来查看标头数据。我们一般都会添加User-Agent信息。
浏览器查看headers 另外,User-Agent 还可以通过第三方包fake-useragent 实例化。但fake-useragent的实例化对象在国内可能无法使用。你可以在网上找一下。或者参考以下文章:https://blog.csdn.net/jiduochou963/article/details/90383692
使用fake-useragent就可以了。当我们设置了第一个参数header之后,我们就可以尝试爬取一小部分信息了。我们使用以下网站:欢乐时刻笑话:http://xiaodiodaya.cn/article/view.aspx?id=7436
导入请求
从fake_useragent 导入UserAgent
url="http://xiaodiodaya.cn/article/view.aspx?id=7436" # 请求网址
headers={"User-Agent": UserAgent().random} # 设置header 参数
response=requests.get(url, headers=headers) # 发送请求并接收数据作为响应
response.encoding="utf-8" # 设置返回数据的编码为utf-8以查看中文
print(response.text) # 打印输出文本内容笑话抓取导入请求
从fake_useragent 导入UserAgent
url="http://xiaohua.zol.com.cn"
headers={"User-Agent": UserAgent().random}
响应=requests.get(url, headers=headers)
响应.编码="gbk"
print(response.text) 中关村笑话爬取
2.3.3 设置爬取时间间隔
当我们使用爬虫爬取网站时,如果不设置爬虫间隔,可能会导致网站在短时间内被大量访问,造成网站服务器崩溃,或者被网站服务器检测到异常IP会直接封杀。因此,为了减少抓取次数,我们可以设置抓取的间隔时间。我们可以使用time 包来设置sleep() 睡眠时间。这样就可以消除短期的大量访问。
导入请求
从fake_useragent 导入UserAgent
从时间导入睡眠
url="http://xiaohua.zol.com.cn"
headers={"User-Agent": UserAgent().random}
响应=requests.get(url, headers=headers)
响应.编码="gbk"
打印(响应.文本)
sleep(2) 一般来说,需要时间间隔的爬虫都会有大量的循环爬取,但上面的代码实际上只爬取一次,所以不需要时间间隔。我目前没有太多数据可以爬取,所以我只是写了如何设置,而不是完整的演示。
2.3.4 代理IP
我们注意到我们构建了一个健康的爬虫,并且还设置了标题和时间间隔。不过,有可能网站的服务器反爬虫算法仍然检测到了我们的爬虫程序。虽然一般不会出现IP封堵的情况,但不可否认的是,IP封堵的情况是有可能发生的。因此,我们可以通过设置代理IP来访问。
导入请求
从fake_useragent 导入UserAgent
url="http://httpbin.org/get"
headers={"User-Agent": UserAgent().random}
代理={
"http": "http://140.246.30.24:3828"
}
响应=requests.get(url,标头=标头,代理=代理,流=True)
响应.编码="utf-8"
print(response.raw._connection.sock.getpeername()[0])ip代理
如果您购买了IP,则在输入IP时需要输入用户名和密码。另外,代理是百度的,所以可能已经过期了。
导入请求
从fake_useragent 导入UserAgent
url="http://httpbin.org/get"
headers={"User-Agent": UserAgent().random}
代理={
"http": "http://user:password@140.246.30.24:3828/"
}
响应=requests.get(url,标头=标头,代理=代理,流=True)
响应.编码="utf-8"
print(response.raw._connection.sock.getpeername()[0])
2.3.5 输入cookies
爬虫不得不说的一件事是,如今大多数网站都添加了验证机制。如果您只想短时间使用,可以先登录,登录后从浏览器获取您的cookie信息,并将cookie信息传入爬虫程序,这样您就可以在短时间内爬取内容。
比如我们要爬取猫眼电影。现在猫眼电影使用美团验证。一旦爬虫遇到验证,就会立即停止。除非您进行了相应的设置,否则我们会使用cookies进行短期抓取。
这次我们非常幸运。我们没有遇到验证中心,但是总有翻车的可能,所以我们还是添加cookie吧。
不要传入cookie
添加cookies
添加cookie除了用于验证之外,还可以用于验证登录用户。因此,cookie的处理也更加重要。
2.3.6 动态数据
目前我们使用requests获取的数据是静态网页数据,也就是说数据都是HTML结构的。但是,有可能我们使用爬虫爬取的数据是动态数据,即JavaScript渲染的数据。因此,我们可以使用selenium进行动态渲染,然后爬取数据。这部分稍后会介绍。现在只有一个概念。
3. 爬虫信息提取
我们在会议中介绍的requests库的get方法以及添加的各种参数只得到了整个网页信息。正如我们之前的Gif动画所示,我们每次抓取的数据都是整个HTML页面的数据。如果这样的数据不经过处理,人眼仍然可以找到我们想要的数据。但当数据量很大时,这种效率就太低了。为了提高效率。我们介绍以下数据提取方法。
3.1 xpath选择器
命令功能/从根节点选择数据//从任意满足条件的节点选择数据。当前节点.上一个节点/[@Attribute="value"]根据属性值选择数据/@Attribute获取某个属性的值/文本获取文本内容/标签[i]获取第i个内容/标签的label [last()-i]获取标签从最后开始的第i+1个内容/*获取某个路径下的所有标签/@*获取某个标签下的所有属性内容。比如我们要获取这个笑话下的内容:http://xiaohua.zol.com.cn/detail60/59364.html
导入请求
从fake_useragent 导入UserAgent
从lxml 导入etree
url="http://xiaohua.zol.com.cn/detail60/59364.html"
标题={
"用户代理": UserAgent().random
}
响应=requests.get(url, headers=headers)
响应.编码="gbk"
# 实例化HTML 对象
html=etree.HTML(响应.文本)
# 获取笑话数据
笑话=html.xpath("//div[@class="article-text"]/p")
# 遍历所有笑话变量,取出每个变量的文本属性
笑话中的笑话:
print(joke.text) 爬取笑话信息
3.2 css选择器
命令功能。 value 1 class属性的值为value 1 # value 1 id属性的值为value 1 label 1,label 2选择label 1和label 2 label 1 label 2 label 1 Tag 2 Below Tag 1 Tag 2 Tag 1 Below Tag 2 [Attribute 1] 获取所有属性为1 的标签[Attribute 1="some value"] 获取所有属性为1 且值为某个值的标签Tag:nth -child[ 下的节点(子节点)的标签i] label:nth-last-child[i]下的最后一个节点(子节点)标签label:last-child 标签的最后一个子节点标签.get_attribute("属性名称") 获取某个属性下的属性名称标签。这个属性的值依然是爬取同一个笑话的内容。首先,安装pyquery三方包。从pyquery 导入PyQuery 作为pq
从fake_useragent 导入UserAgent
url="http://xiaohua.zol.com.cn/detail60/59364.html"
标题={
"用户代理":UserAgent().random
}
数据=pq(url=url,标题=标题)
笑话=datas("div.article-text p")
笑话中的笑话:
print(joke.text) css 选择器
3.3 beautifulsoup选择器
使用解析器的优缺点Python 标准库BeautifulSoup(markup, “html.parser”) 1. Python 内置标准库2. 执行速度适中3. 文档容错能力强Python 在2.7.3 或3.2.2 之前的版本中,文档容错能力较差lxml HTML 解析器BeautifulSoup(markup, "lxml") 1. 速度快2. 文档容错能力强。需要安装C语言库lxml XML解析器BeautifulSoup(markup , ["lxml", "xml"])
BeautifulSoup(标记,“xml”)1。快2. 唯一支持XML 的解析器需要安装C 语言库html5libBeautifulSoup(markup, “html5lib”)1。最好的容错能力2.以浏览器方式解析文档3.生成HTML5格式的文档4.速度慢不依赖外部扩展对象。命令功能标记。标签beautifulsoup 文档树的标签可以类比HTML中的双标签来理解。输出标签和内部值。 NavigableString.string 获取字符串content.text 获取文本内容搜索对象find_all("标签名称") 查找所有名为标签名称的标签的内容find("标签名称") 查找第一个符合条件的标签和内容css 选择只需使用与.select() 对应的css 语法。请参阅上一节。为了仍然获得同一个笑话的内容,您需要先安装beautifulsoup4第三方包导入请求。
从bs4 导入BeautifulSoup
从fake_useragent 导入UserAgent
url="http://xiaohua.zol.com.cn/detail60/59364.html"
标题={
"用户代理": UserAgent().random
}
datas=requests.get(url, headers=headers)
html=数据.text
# 实例化汤对象
汤=BeautifulSoup(html, "lxml")
笑话=soup.find_all("div", attrs={"class":"article-text"})
笑话中的笑话:
print(joke.text)beautifulsoup 选择数据
3.4 Python正则表达式
命令说明^ 匹配字符串的开头$ 匹配字符串的结尾。匹配任何字符,换行符除外。当指定re.DOTALL标签时,它可以匹配包括换行符。 [.] 中的任意字符用于表示一组字符,单独列出: [amk] 匹配"a"、"m" 或"k" [^.] 不在[] 中的字符: [^abc ] 匹配除a、b、c之外的字符。匹配0 个或多个表达式+ 匹配1 个或多个表达式?匹配前面正则表达式定义的0 或1 个片段,非贪婪{n} 之前的表达式出现n 次{n,} re{n, m} 之前的表达式至少出现n 次re{n,} 之前的正则表达式m} 出现在n 到m 次之间a 匹配括号中的a 字符() 表达式,代表一组w匹配字母数字字符和下划线W匹配非字母数字字符和下划线s匹配任何空白字符,相当于[tn rf].S匹配任意非空白字符d匹配任意数字,相当于[0-9]D匹配任意非数字A匹配字符串开头Z匹配字符串结尾。如果有换行符,则仅匹配换行符之前的字符串末尾。 cz 匹配字符串结尾G 匹配最后一次匹配完成的位置b 匹配单词边界,指单词和空格之间的位置。例如,"erb" 可以匹配"never" 中的"er",但不能匹配"verb" 中的"er" B 匹配非单词边界。 "erB" 匹配"verb" 中的"er",但不匹配"never"n、t 等中的"er"。匹配换行符。匹配制表符。等等1.9 匹配第n组的内容10 如果匹配则匹配第n组的内容。否则,指八进制字符代码的表达[u4e00-u9fa5]中文导入请求
进口重新
从fake_useragent 导入UserAgent
url="http://xiaohua.zol.com.cn/detail60/59364.html"
标题={
"用户代理":UserAgent().random
}
datas=requests.get(url,headers=headers).text
笑话=re.findall(r"s*(.+)s*
",数据)
笑话中的笑话:
print(joke) 正则笑话提取
4. 实例
经过第2部分的参数设置和第3部分的信息提取,现在我们可以从静态页面中爬取所有我们想要爬取的数据了。那么,现在我们来做一个案例。
案例:爬取哔哩哔哩的每日排行榜
还记得我们之前讲的爬虫套路吗?现在你可以使用ctrl+Home返回主页,看看有哪些例程。让我们按照这个套路来爬我们哔哩哔哩视频网站的每日排名吧。
首先,我们需要找到Bilibili每日排行版的url接口,并获取url。 https://www.bilibili.com/ranking](https://www.bilibili.com/ranking 提取这些数据
F12可以查看网页的HTML代码。因此,在分析页面后,我们确定了如何提取"标题", "排名", "得分", "播放量", "热度", "up", "upid", "视频地址"
我们可以使用上面介绍的各种方法来提取数据。这里我会使用xpath和beautifulsoup来解释。下一步是编码。 beautifulsoup提取信息导入请求
从bs4 导入BeautifulSoup
导入csv
从日期时间导入日期时间
url="https://www.bilibili.com/ranking"
# 发起网络请求
响应=requests.get(url)
html=响应. 文本
汤=BeautifulSoup(html, "html.parser")
items=soup.find_all("li", {"class": "rank-item"})
内容=[]
对于items: 中的项目
title=item.find("a", {"class": "title"}).text # 视频标题
video_url=item.find_all("a")[1].get("href") #AV号链接
Score=item.find("div", {"class": "pts"}).find("div").text # 综合得分
rank=item.find("div", {"class": "num"}).text # 排名
up=item.find_all("span", {"class": "data-box"})[2].text # 向上
up_id=item.find_all("a")[2].get("href") # upid
up_url="https:" + up_id
plays=item.find_all("span", {"class": "data-box"})[0].text # 播放音量
hots=item.find_all("span", {"class": "data-box"})[1].text # 热度
内容=[标题、排名、得分、播放次数、热点、up、up_url、video_url]
内容.追加(内容)
now=datetime.now().strftime("%Y%m%d_%H%M%S")
file_name=f"{now}top.csv"
# 保存为csv文件
打开(文件名,"w+",编码="utf-16",换行="")作为f:
f_csv=csv.writer(f)
f_csv.writerow(["标题", "排名", "评分", "播放量", "人气", "up", "upid", "视频地址"])
f_csv.writerows(contents)beautifulsoup提取Bilibili每日排名xpath提取信息导入请求
从lxml 导入etree
导入csv
从日期时间导入日期时间
url="https://www.bilibili.com/ranking"
# 发起网络请求
响应=requests.get(url)
html=响应. 文本
数据=etree.HTML(html)
# 获取数据
标题=datas.xpath("//div[@class="info"]/a") #
视频标题 video_urls = datas.xpath("//div[@class="info"]/a/@href") # av号链接 scores = datas.xpath("//div[@class="pts"]/div") # 综合得分 ranks = datas.xpath("//li[@class="rank-item"]/div[@class="num"]") # 排名 ups = datas.xpath("//div/a/span[@class="data-box"]") # up up_ids = datas.xpath("//div[@class="detail"]/a[@target="_blank"]/@href") # upid plays = datas.xpath("//div[@class="detail"]/span[1]") # 播放量 hots = datas.xpath("//div[@class="detail"]/span[2]") # 热度 contents = [] for i in range(100): title = titles[i].text video_url = video_urls[i] score = scores[i].text rank = ranks[i].text up = ups[i].text up_id = up_ids[i] up_url = "https:" + up_id play = plays[i].text hot = hots[i].text content = [title, rank, score, play, hot, up, up_url, video_url] contents.append(content) now = datetime.now().strftime("%Y%m%d_%H%M%S") file_name = f"{now}top.csv" with open(file_name, "w+", encoding="utf-16", newline="") as f: f_csv = csv.writer(f) f_csv.writerow(["标题", "排名", "得分", "播放量", "热度", "up", "upid", "视频地址"]) f_csv.writerows(contents)xpath爬取哔哩哔哩日排行榜三:动态爬虫
上面我们提及到的爬虫都是属于静态网站的爬虫,该类爬虫的资源都直接摆放在HTML页面里面,因此十分容易爬取。但是,也有资源放置在动态JavaScript里面的网页,比如我们的部分图片网站。 上面我们爬取了视频网站,也爬取了笑话网站,那么这一次我们试一下动态爬取图片网站。我选择poco这个网站,链接如下:https://www.poco.cn/,可以自己进入网站看看哈。 首先,为了爬取动态网站的资源,我们需要安装对应浏览器的webdriver,以下贴出chrome的webdrive地址为:http://npm.taobao.org/mirrors/chromedriver/ Edge的webdriver地址为:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ 我们除了要安装webdriver外,还必须要为我们的python安装selenium这个第三方包。安装命令为 pip install selenium如此,我们的准备工作就做完了,在我们爬取poco网站的图片时,必须要注意传入选用的webdriver的地址给selenium,否则selenium会不知道使用哪个浏览器,以及没有工具打开浏览器。 至于其余的爬虫思路和我们最开始提到的爬虫套路是一模一样的,没有什么区别,只是我们爬虫使用的工具换成了selenium而已。案例:selenium爬取poco图片
我录制了一个视频,上传到了B站,可以直接点击下方链接查看selenium的基础使用: 【爬虫】【python】动态网站图片爬取之再也不怕小姐姐没有地方放了 https://www.bilibili.com/video/BV1A7411u7Ys四:scrapy框架的使用
无论是使用我们的requests爬取静态资源库,还是使用我们的selenium爬取动态资源库,手动要写的代码都要写的较多。为了写更少的代码,我们可以直接使用scrapy框架来进行模式化爬虫。 在使用之前,我们必须要先安装scrapy框架。如果直接安装scrapy框架,会提示我们安装一个几个G的C框架。为了不这么麻烦,因此我们下载twisted的whl文件,本地安装之后就可以直接安装scripy框架了。 我们到如下网站:https://www.lfd.uci.edu/~gohlke/pythonlibs/,搜索twisted文件,结合你的python版本选择whl文件下载到本地。 使用本地安装命令 pip install "本地路径/twisted的对应python版本文件.whl"之后再使用pip安装scripy即可成功安装。好了,文章到这里就结束啦,如果本次分享的高效数据分析入门指南:数据采集技巧、Python爬虫实例解析及实操教程和问题对您有所帮助,还望关注下本站哦!
【高效数据分析入门指南:数据采集技巧、Python爬虫实例解析及实操教程】相关文章:
用户评论
这个标题看上去很有干货啊,想要学习数据分析、数据获取和 Python爬虫入门。
有10位网友表示赞同!
GIF演示?太棒了!这样学起来更直观。
有19位网友表示赞同!
最近想学习Python爬虫,看到你这个帖子感觉很合适,赶紧收藏一下。
有5位网友表示赞同!
实例代码能让我更快地理解概念,谢谢分享!
有10位网友表示赞同!
我之前对这三个方面都一头雾水,看来要好好学习了!
有7位网友表示赞同!
终于有人发这个类型的教学啦!我已经等了好久!
有19位网友表示赞同!
感觉很实用,希望有详细的讲解和案例分析。
有19位网友表示赞同!
Python爬虫真的很有用, 可以提取网站上的很多信息真是方便。
有13位网友表示赞同!
数据分析、数据获取和 Python 爬虫都是现在非常热门的技术!
有18位网友表示赞同!
分享这份资源,让我能更快地学习这方面的知识!
有5位网友表示赞同!
希望有讲解常见问题的解决方案,这样更有针对性
有9位网友表示赞同!
GIF演示特别吸引人,我喜欢这种生动直观的教学方式。
有20位网友表示赞同!
这个标题很有吸引力,让人想要点进去看看内容。
有10位网友表示赞同!
看起来像是一份比较全面的入门教程,很喜欢这种“一体化”的学习方式
有17位网友表示赞同!
数据分析、数据获取 和 Python爬虫都是我最想学习的技能!
有13位网友表示赞同!
期待深入了解Python脚本的编写和调试技巧!
有19位网友表示赞同!
这个课程内容很适合零基础的人看,非常实用!
有8位网友表示赞同!
我很想在实际项目中应用这些知识,希望教程里有案例讲解
有16位网友表示赞同!