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. 表示方法: .* .+ .?
非贪婪
  1. 在整个表达式匹配成功的前提下,尽可能少的匹配* + ?
  2. 表示方法: .*? .+? .??

爬虫尽量使用非贪婪匹配。

分组总结:

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">&#xe615;</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()


posted @   zxinlog  阅读(174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示