bs4AndPyquery

本文总结了代理的使用,包括在requests和selenium中设置代理的方法。接着介绍了selenium如何控制页面滚动,以及bs4库的数据解析步骤,包括创建解析器、选择标签、按属性查找以及获取内容和属性。
摘要由CSDN通过智能技术生成

今日总结

一、代理的使用

需先在代理网站购买获得API,商用代理推荐:蘑菇代理、芝麻代理、快代理、讯代理、阿布云代理

1.requests设置代理
import requests
import time
from re import findall


# 获取代理
def get_ips(url):
    response = requests.get(url)
    if response.text[0] == '{':		# 若未按频率获取会获取非ip值,故排除
        return None
    result = [x for x in response.text.split('\n') if x]
    return result


# requests使用代理打开豆瓣电影top250网站并取得所有排名、电影名、评分
def get_douban():
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36'
    }
    # 不断获得代理ip直到取到ip位置
    while True:
        ips = get_ips()
        if ips:
            break
        time.sleep(11)   # 取ip频率10s/次,故大于10s

    # 添加代理
    proxies = {'http': ips[0], 'https': ips[0]}
    response = requests.get('https://movie.douban.com/top250', headers=headers, proxies=proxies)
    if response.status_code == 200:
        re_str = r'(?s)<li>\s*<div class="item">.+?alt="(.+?)".+?"v:average">(.+?)</span>.+?</li>'
        result = findall(re_str, response.text)		# 取电影名和评分
        new_result = [[index+1, *result[index]] for index in range(len(result))]
        print(new_result)
    else:
        print('获取数据失败')

2. selenium设置代理
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
import requests
import time


# 获取ip
def get_ips(url):
    response = requests.get(url)
    if response.text[0] == '{':		# 若未按频率获取会获取非ip值,故排除
        return None
    result = [x for x in response.text.split('\n') if x]
    return result


#selenium使用代理打开豆瓣电影top250网站
def open_douban():

    # 不断获得代理ip直到取到ip位置
    while True:
        ips = get_ips()
        if ips:
            break
        time.sleep(11)

    if ips:
        options = ChromeOptions()
        # 添加代理
        # option.add_argument('--proxy-server=http://代理ip:端口')
        options.add_argument(f'--proxy-server=http://{ips[0]}')
        b = Chrome(options=options)
        b.get('https://movie.douban.com/top250')
    else:
        print('获取ip失败!')

二、selenium控制页面滚动

1. 滚动相关知识了解

	<!DOCTYPE html>
	<html>
		<head>
			<meta charset="utf-8">
			<title></title>
		</head>
		<body>
	        <div>
	            <p id="p1">我是段落1</p>
	            <a href="https://www.baidu.com">百度</a>
	            <input type="" name="" id="content" value="123" />
	            <button type="button" onclick="changeP()">确定</button>
	        </div>
	        <div id="" style="height: 10000px; background-color: #008000;">
	            
	        </div>
	        <p>end</p>
	        <button type="button" onclick="SC()" style="position: fixed; top: 100px; right: 100px;">滚动</button>
	        
	        <!-- 控制页面滚动 -->
	        <script type="text/javascript">
	            height = 200
	            function SC(){
	                console.log('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
	                window.scrollTo(0, height)
	                height += 200
	         
	                console.log(document.body.scrollHeight, height)
	            }
	            
	            
	        </script>
	        
	        <script type="text/javascript">
	            // 1. 获取标签的内容
	            // 1)获取标签
	            // document  -  指向整个页面
	            p = document.getElementById('p1')
	            console.log(p)
	            
	            div = p.parentElement
	            
	            console.log(div.children)
	            
	            // 2)获取标签内容
	            console.log(p.innerText)   // 我是段落1
	            a = document.getElementsByTagName('a')[0]
	            console.log(a.getAttribute('href'))    // https://www.baidu.com
	            
	            // 2.修改标签内容
	            // xxx发生了xxx就干xxx
	            function changeP(){
	                console.log('!!!!!!!')
	                input = document.getElementById('content')
	                value = input.value
	                // console.log(value)
	                p.innerText = value
	            }
	            
	            // 3.创建标签并且添加标签
	            fruits = ['苹果', '葡萄', '西瓜', '橙子']
	            for(index in fruits){
	                fName = fruits[index]
	                p = document.createElement('p')
	                p.innerText = fName
	                console.log('div:', div)
	                div.appendChild(p)
	            }
	            
	            
	            
	            
	        </script>
	        
	        <script type="text/javascript">
	            console.log('===================================')
	            // 写js代码
	            name = 'bobo'
	            console.log(name, 100)
	            
	            age = 23
	            console.log(100 + age)
	            
	            message = 'hello world!'
	            for(x in message){
	                console.log(x, message[x])
	            }
	            console.log('===============================')
	            index = 0
	            while(true){
	                console.log(message[index])
	                index += 1
	                if(index >= message.length){
	                    break
	                }
	            }
	            
	            list1 = [10, 20, 1.23, 'abc']
	            
	            // student = {
	            //     'name': '小明',
	            //     'age': 18,
	            //     'gender': '男'
	            // }
	            
	            student = {
	                name: '小明',
	                age: 18,
	                gender: '男'
	            }
	            console.log(student['name'])
	            console.log(student.age)
	            
	            console.log(list1)
	            
	            function sum1(num1, num2){
	                return num1 + num2
	            }
	            
	            result = sum1(10, 20)
	            console.log(result)
	            
	            // 匿名函数
	            f1 = function (num1, num2){
	                return num1 + num2
	            }
	            console.log(f1(100, 200))
	            
	            nums = [19, 28, 39, 76, 19]
	            result = nums.reduce(function(x, item){
	                return x + item
	            }, 0)
	            console.log(result)
	            
	        </script>
		</body>
	</html>
	
2. selenium滚动设置
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import time

def page_scrolling(url):
    global b
    b = Chrome()
    b.get(url)
    search = b.find_element_by_css_selector('#key')
    search.send_keys('手机')
    search.send_keys(Keys.ENTER)
    time.sleep(1)

    # 一步到位,滚动到底部
    # b.execute_script('window.scrollTo(0, document.body.scrollHeight)')

    # 一点一点的滚动: 500 -> 修改成每次需要滚动的距离,单位是像素;  1000 -> 每次滚动的时间间隔,单位是毫秒
    b.execute_script("""
                height = 300
                t = setInterval(function(){
                    if (height > document.body.scrollHeight){
                        clearInterval(t)
                    }
                    window.scrollTo(0, height)
                    height += 300
                }, 1000)
    """)

三、bs4数据解析

先安装BeautifulSoup第三方库

BeautifulSoup是基于css选择器的解析库

1. 准备数据

一般是通过requests或者selenium爬取到的

with open('data.html', encoding='utf-8') as f:
    content = f.read()
2.创建BeautifulSoup解析器对象

BeautifulSoup(解析对象, 解析器类型)

  • 解析对象 - 一般是html格式字符串(一般是通过requests或者selenium爬取到的)
  • 解析器类型 - lxml(最常用)、html.parser、xml、html5lib
soup = BeautifulSoup(content, 'lxml')
3.获取标签

通过css选择器

  • 解析器对象.select(css选择器) - 在整个页面中按照css选择器查找指定标签
  • 标签对象.select(css选择器) - 在当前标签中按照css选择器查找指定标签
result = soup.select('p')
print(result)

result = soup.select('#f1')
print(result)

result = soup.select('div>p')
print(result)

# 嵌套写法: 标签1.标签2.标签3....   ->  获取标签1中第一个标签2中的第一个标签3...
div = soup.select('div')[0]
print(div.p)

ol = soup.select('#o1')[0]
print(ol)

print(ol.li)
print(ol.select('li'))


lis = soup.select('#o1>li')
print(lis)
4. 按照指定属性值查找标签

获取href属性值是’https://www.jd.com’的标签

result = soup.find_all(attrs={'href': 'https://www.jd.com'})
print(result)

获取tag属性是’hot’的所有标签

result = soup.find_all(attrs={'tag': 'hot'})
print(result)

获取tag属性是’hot’并且height属性是’100’的所有标签

result = soup.find_all(attrs={'tag': 'hot', 'height': '100'})
print(result)
5.获取内容和属性
  • 标签.string - 获取双标签的文字内容(注意:被获取的标签中不能有子标签,否则结果是None)
  • 标签.contents - 获取双标签的内容(包括文字内容和子标签)
b1 = soup.select('#f1')[0]
print(b1.string)    # 我是font1

b2 = soup.select('#f2')[0]
print('===:', b2.string)   # ===: None

print(b1.contents)   # ['我是font1']
print(b2.contents, b2.contents[-1].string)   # ['我是font2 ', <a href="#">abc</a>]  abc

print(b1.get_text())    # 我是font1
print(b2.get_text())    # 我是font2 abc
6. 获取标签属性

标签对象.attrs[属性名]

b3 = soup.body.div.a
print(b3.attrs['href'])    # https://www.baidu.com

b4 = soup.find_all(attrs={'title': 't百度'})[0]
print(b4.attrs['src'], b4.attrs['title'])    # https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png t百度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值