Day3_代理和css解析

本文介绍了如何获取网络代理IP并用于爬虫,通过Python的requests库实现数据抓取。同时,详细讲解了如何使用BeautifulSoup库进行CSS选择器选择标签,获取内容和属性,并展示了CSV文件的读写操作。内容涵盖了代理获取、网页抓取、HTML解析和数据处理的基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Day3_代理和css解析

获取代理

  1. 找到购买代理网站,推荐蘑菇代理.
  2. 根据api获取ip地址,然后用新的ip地址给proxies赋值
def get_proxy_ips():
    api = 'http://piping.mogumiao.com/proxy/api/get_ip_bs?appKey=3ee6f035175f4b508d8a825da0fb3833&count=5&expiryDate=0&format=2&newLine=3'
    response = requests.get(api)
    if response.status_code == 200:
        if response.text[0] == "{":
            print('获取代理失败,提取频繁')
        else:
            print(response.text.split('\n')[:-1])
            return response.text.split('\n')[:-1]
    else:
        print('获取代理失败')


def get_net_data():
    url = 'https://movie.douban.com/top250'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'
    }
    # 代理
    ips = get_proxy_ips()
    if ips:
        proxies = {
            'http': ips[0],  # 'http': 'ip地址:端口号'
            'https': ips[0]
        }
        response = requests.get(url, headers=headers, proxies=proxies)
        print(response.text)
    else:
        print('没有成功获取代理!')

if __name__ == '__main__':
    get_net_data()
  1. 同时获取多个ip地址进行爬虫.
import time
import requests
def get_proxy_ips():
    api = 'http://piping.mogumiao.com/proxy/api/get_ip_bs?appKey=3ee6f035175f4b508d8a825da0fb3833&count=5&expiryDate=0&format=2&newLine=3'
    response = requests.get(api)
    if response.status_code == 200:
        if response.text[0] == "{":
            print('获取代理失败,提取频繁')
        else:
            print(response.text.split('\n')[:-1])
            return response.text.split('\n')[:-1]
    else:
        print('获取代理失败')

def get_net_data():
    url = 'https://movie.douban.com/top250'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36'
    }
    # 代理
    while True:
        # 获取5个代理ip
        ips = get_proxy_ips()
        if not ips:
            time.sleep(1)
            continue
        ips = iter(ips)
        for ip in ips:
            proxies = {
                'http': ip,  # 'http': 'ip地址:端口号'
                'https': ip
            }
            try:
                response = requests.get(url, headers=headers, proxies=proxies, timeout=2)
                if response.status_code == 200:
                    print(response.text)
                    return
                else:
                    print('数据请求失败!')
            except:
                print('超时,继续请求!')

if __name__ == '__main__':
    get_net_data()

bs4的使用(从bs4导入BeautifulSoup模块)

  1. 创建解析器对象

    BeautifulSoup(需要解析的html字符串,解释器名称)

bs = BeautifulSoup(data, 'lxml')
  1. 根据css选择器获取标签

    • select(css选择器) - 选择器选中的所有标签
    • select_one(css选择器) - 获取选择器中的第一个标签
  2. 获取标签内容

    • 标签对象.string - 获取标签的文字内容(如果标签中还有子标签的话,返回None)
    • 标签对象.get_text() - 获取标签的文字内容(如果有子标签,会将子标签中文本一同取出)
    • 标签对象.contents - 获取标签中文字内容和子标签,返回的是一个列表
  3. 获取标签属性

    • 1标签对象.attrs[属性名]
img = bs.select_one('img')
print(img.attrs['src'])
  1. 在指定标签中获取子标签
    • 标签对象.select(css选择器) - 获取指定标签中选择器选中的所有子标签
    • 标签对象.select_one(css选择器) - 获取指定标签中选择器选中的第一个子标签
div = bs.select_one('div')
p1 = div.select_one('p')

csv文件操作

  1. 将数据写入csv中

    1. 用列表方式写入数据
    with open('./file/test.csv', 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(['姓名', '性别', '年龄', '分数'])
        writer.writerows([
            ['张三', '男', 28, 98],
            ['小明', '男', 19, 72],
            ['小花', '女', 20, 99]
        ])
    
    1. 用字典提供数据
    with open('./file/dictest.csv', 'w', newline='', encoding='utf-8') as f:
        writer = csv.DictWriter(f, ['name', 'age', 'gender', 'score'])
        # 第一行内容
        writer.writerow({'name': '姓名', 'age': '年龄', 'gender': '性别', 'score': '分数'})
        # writer.writeheader()  # 将key值作为第一行
        # 写一行
        writer.writerow({'name': '张三', 'age': 28, 'gender': '男', 'score': 98})
        # 写多行
        writer.writerows([
            {'name': '张三', 'age': 28, 'gender': '男', 'score': 98},
            {'name': '小明', 'age': 19, 'gender': '男', 'score': 72},
            {'name': '小花', 'age': 20, 'gender': '女', 'score': 99}
        ])
    
  2. 读取csv文件内容

    1. 一行数据对应一个列表
    with open('./file/dictest.csv', 'rt', newline='', encoding='utf-8') as f:
        reader = csv.reader(f)
        print(next(reader))
        print(list(reader))
    
    1. 一行数据对应一个字典(第一行作为key)
    with open('./file/dictest.csv', 'rt', newline='', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        print(next(reader))
        print(next(reader))
        print(next(reader))
        print(next(reader))
    

注意:任意一个csv文件都可以选择使用列表或者字典的方式去读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值