目录
今日总结
一、代理的使用
需先在代理网站购买获得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百度