Python爬虫-百度贴吧
python爬虫(第四阶段13天,爬虫,大数据hadoop,数据结构)
1 爬虫介绍
爬虫可以爬取数据,进行分析统计
爬虫不可以干扰企业正常运行,不可以采取个人信息
爬虫分类:
(1)通用网络爬虫,搜索引擎使用,遵守robots协议
(2)聚焦网络爬虫:自己写的爬虫程序
2 爬虫请求模块
2.1 request模块
安装:
linux系统:sudo pip3 install requests
windows系统: pip3 install requests
Anaconda: conda install requests
get() 向服务器发起一个请求
参数:
url:需要抓取的URL地址
headers:请求头
timeout:超时时间,超时会抛异常
import requests
# get() 向服务器发起一个请求,获取一个响应对象。
resp = requests.get(url="https://2yuan.xyz/")
print(resp)
html = resp.text
html = resp.content
code = resp.status_code
url = resp.url
print(url)
响应对象(resp)属性:
# text属性,获取相应内容,字符串
# content属性,获取相应内容-字节串(主要用来抓取图片,文件,视频等)
# status_code,响应码
# url 属性,返回实际数据的url地址
2.2 Headers
爬虫很容易被检测出来,可以查看Headers中的User-Agent,因此要修改headers中的User-Agent
可以通过该网站查看自己的Headers
http://httpbin.org/get
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36"}
resp = requests.get(url="http://httpbin.org/get", headers=headers)
通过这种方式,伪造User-Agent。
2.3 通过循环翻页
for i in range(1,101):
url = f"https://gz.lianjia.com/ershoufang/pg{i}/"
print(url)
可以通过休眠控制爬取频率。
time.sleep(random.randint(1,3))
爬取百度**
import requests
import os
headers = {
"User-Agent": "User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
}
# 1. 拼接URL地址
word = input("请输入搜索内容:")
URL = f"https://www.baidu.com/s?wd={word}"
# 2. 发请求保存
resp = requests.get(url=URL, headers=headers)
html = resp.text
filename = word + ".txt"
with open(filename, "w", encoding="utf-8") as f:
f.write(html)
2.4 百度贴吧爬虫
# 百度贴吧爬虫
"""
实现步骤:
1. 查看数据在网页是否存在
2. 查找分析url规律
3. 爬虫访问,获取响应
4. 保存数据
"""
import requests
from time import sleep
from random import randint
# 伪造User-Agent
headers = {
"User-Agent": "User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
}
kw = input("输入查询内容:")
pn = input("页数:")
# 百度贴吧翻页每次增加50
pn = (int(pn) - 1) * 50
for i in range(0, pn + 1, 50):
URL = f"https://tieba.baidu.com/f?kw={kw}&pn={i}"
resp = requests.get(url=URL, headers=headers)
# 降低爬取频率
sleep(randint(1, 3))
html = resp.text
# 文件保存
with open(f"{kw}_第{i // 50 + 1}页", "w", encoding="UTF-8") as f:
f.write(html)
# 类版本
# 百度贴吧爬虫
"""
实现步骤:
1. 查看数据在网页是否存在
2. 查找分析url规律
3. 爬虫访问,获取响应
4. 保存数据
"""
import requests
from time import sleep
from random import randint
class TiebaSpider:
def __init__(self):
# 用来初始化变量
# 网页和headers的伪装
self.URL = "https://tieba.baidu.com/f?kw={}&pn={}"
self.headers = {
"User-Agent": "User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
}
def cro(self, url, kw, page):
# 用来访问服务器
for i in range(0, page + 1, 50):
resp = requests.get(url=url.format(kw, i), headers=self.headers)
html = resp.text
sleep(randint(1, 2))
self.save(html, kw, i)
def save(self, html, kw, page):
# 用来保存数据
with open(f"{kw}第{page // 50 + 1}页", "w", encoding="UTF-8") as f:
f.write(html)
def crawl(self):
# 程序入口
kw = input("输入查询内容:")
pn = input("页数:")
pn = (int(pn) - 1) * 50
self.cro(self.URL, kw, pn)
if __name__ == "__main__":
spider = TiebaSpider()
spider.crawl()
修改版本
import requests
import time
import random
class TiebaSpider:
def __init__(self):
# 定义常用变量
self.url = "https://tieba.baidu.com/f?kw={}&pn={}"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
}
def get_html(self, url):
# 请求函数,获取html页面
html = requests.get(url=url, headers=self.headers).text
return html
def parse_html(self):
# 解析提取数据
pass
def save_html(self, filename, html):
# 保存
with open(filename, "w", encoding="UTF-8") as f:
f.write(html)
def crawl(self):
name = input("请输入贴吧名:")
start = int(input("起始页:"))
end = int(input("终止页:"))
for page in range(start, end + 1):
# 拼接url
url = self.url.format(name, (page - 1) * 50)
# 获取数据
html = self.get_html(url)
# 存储数据
self.save_html(f"{name}第{page}页", html)
# 控制频率,uniform生成浮点数
time.sleep(random.uniform(1, 2))
# 增加页面提示,抓取完成
print(f"第{page}页爬取完成.")
if __name__ == "__main__":
spider = TiebaSpider()
spider.crawl();
3 正则解析模块re
元字符 含义
. 任意一个字符
\d 一个数字
\w 普通字符
\s 空白字符
\S 非空白字符
[] 包含[]内容
- 出现0或多次
- 出现1或多次
() 字符串提取出来到列表
如何让 . 匹配 换行\n
findall(".",html,re.S)
贪婪和非贪婪
贪婪
- 在整个表达式匹配成功的前提下,尽可能多的匹配* + ?
- 表示方法: .* .+ .?
非贪婪
- 在整个表达式匹配成功的前提下,尽可能少的匹配* + ?
- 表示方法: .*? .+? .??
爬虫尽量使用非贪婪匹配。
分组总结:
1. 在网页中,想要什么内容,就加()
2. 按整体正则匹配,再提取分组()中的内容
如果有两个及以上分组(),则结果中以元组形式显示[(),(),()]
3. 最终结果有3种情况
情况1:[]
情况2:['','',''] 正则中1个分组
情况3:[(),(),()] 正则中多个分组
应用
"""
正则表达式
"""
import re
html = """
<div class="animal">
<p class="name">
<a title="tiger"></a>
</p>
<p class="content">
Two tigers two tigers run fast
</p>
</div>
<div class="animal">
<p class="name">
<a title="rabiit"></a>
</p>
<p class="content">
Small white rabit white and white
</p>
</div>
"""
# r_list = re.findall('<div class="animal">.*?<a title="(.*?)"></a>.*?"content">(.*?)</p>.*?</div>', html, re.S)
r_list = re.findall('.*?title="(.*?)".*?"content">(.*?)</p>', html, re.S)
print(r_list)
for r in r_list:
print("动物名称:", r[0].strip())
print("动物描述:", r[1].strip())
笔趣阁小说爬虫
"""
笔趣阁
"""
import re
import requests
import time
import random
html = """
<div class="item">
<div class="image"><a href="https://www.xbiquge.la/14/14891/"><img src="https://www.xbiquge.la/files/article/image/14/14891/14891s.jpg" alt="大王饶命" width="120" height="150" /></a></div>
<dl>
<dt><span>会说话的肘子</span><a href="https://www.xbiquge.la/14/14891/">大王饶命</a></dt>
<dd> 重生过去、畅想未来、梦幻现实,再塑传奇人生!
</dd>
</dl>
<div class="clear"></div>
</div>
"""
# 爬取网页
class Biquge:
def __init__(self):
self.url = 'https://www.xbiquge.la/'
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
}
def get_html(self, url):
html = requests.get(url=url, headers=self.headers).text
return html
def save_html(self, filename, message):
# 存储文件
with open(filename, "w", encoding="utf-8") as f:
f.write(message)
def crawl(self):
key = input("输入小说种类:")
url = self.url + key + "/"
html = self.get_html(url)
# 针对玄幻小说的动态图的正则
n = 'class="item".*?<dt><span>(.*?)</span>.*?">(.*?)</a>.*?<dd>(.*?)</dd>'
re_list = re.findall(n, html, re.S)
for r in re_list:
print('作者:', r[0])
print('书名:', r[1])
print('介绍:', r[2].strip(), '\n')
if __name__ == "__main__":
spider = Biquge()
spider.crawl()
爬取电影250排行榜
import re
import requests
import time
import random
html = """
电影榜单
<td class="rl_name">
<span class="rl_list_order iconfont">2.</span>
<a href="/title/tt0468569/" title='蝙蝠侠:黑暗骑士' target="_blank"> 蝙蝠侠:黑暗骑士 <span>(2008)</span></a></td>
<td class="rl_grade_IMDB"><i class="iconfont"></i><span>9</span></td>
"""
class MaoyanSpider:
# 常用变量url,headers
def __init__(self):
self.url = "https://www.iyingku.cn/imdb250"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
}
def get_html(self, url):
html = requests.get(url=url, headers=self.headers).text
return html
def crawl(self):
html = self.get_html(self.url)
# 取到了html
n = ".*?rl_name.*?rl_list_order iconf.*?>(.*?)</span>.*?title='(.*?)'.*?<span>((.*?)).*?</i><span>(.*?)</span>"
rl_list = re.findall(n, html, re.S)
for r in rl_list:
print("电影排行:", r[0])
print("电影名:", r[1])
print("上映时间:", r[2])
print("评分:", r[3], '\n')
if __name__ == "__main__":
spider = MaoyanSpider()
spider.crawl()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?