requests+编码模块+百度贴吧数据抓取

发布时间 2023-11-18 19:20:23作者: 枫飘过的天1

1.查看本地发送过去的头文件
import requests
html = requests.get(url='http://httpbin.org/get').text
print(html)

2.编码模块使用  //使用原因:URL不能识别中文编码,中文转换为编码模式)

(1)urlencode()方法
from urllib import parse
params = parse.urlencode({'wd':'赵丽颖'})
url1 = 'http://www.baidu.com/s?' + params #URL拼接方式
url2 = 'http://www.baidu.com/s?%s' % params
url3 = 'http://www.baidu.com/s?{}'.format(params)
print(url1)
print(url2)
print(url3)
语法:format方法,格式化输出 (传参方式)
'{}_第{}页.html'.format('赵丽颖',9) 输出:‘赵丽颖_第9页.html’

(2)quote()方法 //字符串编码,同上类似
params = parse.quote('赵丽颖')

(3)例子   //百度搜索中从终端输入搜索关键字,保存HTML文件到本地

import requests
# 1.拼接URL
keyword = input('请输入关键字:')
params = parse.urlencode({'wd':keyword})
url = 'http://www.baidu.com/s?{}'.format(params)
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}
# 2.发送请求获取响应内容
html = requests.get(url=url, headers=headers).content.decode('utf-8') #直接使用text替代.content.decode('utf-8')可能有乱码
# 3.保存文件到本地
filename = '{}.html'.format(keyword)
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
#windows默认gbk,linux为utf-8

3.百度贴吧数据抓取实战

需求:a.输入贴吧名称(赵丽颖吧)  b.输入起始页:1    c.输入终止页:2   d.保存到本地文件: 赵丽颖吧_第1页.html、赵丽颖吧_第2页.html

思路:
(1)查看抓取的数据在响应内容中是否存在(右键--查看网页源码--搜索所抓数据关键字)
(2)查看并分析URL地址规律:
第1页:http://tieba.baidu.com/f?kw=???&pn=0
第2页:http://tieba.baidu.com/f?kw=???&pn=50
第n页:pn=(n-1)*50
(3)发请求获取响应内容
(4)保存到本地文件

代码如下:
import requests
from urllib import parse
import time
import random

class BaiduSpider:
  def __init__(self):
    """定义常用变量"""
    self.url = 'http://tieba.baidu.com/f?kw={}&pn={}'
    self.headers = headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}

  def get_html(self, url):
    """请求的功能函数,获取响应内容html"""
    html = requests.get(url=url, headers=self.headers).content.decode('utf-8')
    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 run(self):
    """"程序入口函数"""
    name = input('请输入贴吧名:')
    start = int(input('请输入起始页:'))
    end = int(input('请输入终止页:'))
    # 编码
    params = parse.quote(name)
    for page in range(start, end + 1):
      pn = (page - 1) * 50
      page_url = self.url.format(params, pn)
      # 调用请求功能函数
      html = self.get_html(url=page_url)
      #调用保存函数功能函数
      filename = '{}_第{}页.html'.format(name, page)
      self.save_html(filename, html)
      #终端提示
      print('第%d页抓取完成' % page)
      # 控制数据抓取频率,每抓取一个页面随机休眠一段时间
      time.sleep(random.randint(1,2)) #每抓取一个页面随机休眠1-2分钟

if __name__ == '__main__':
  spider = BaiduSpider()
  spider.run()