在爬取数据之前可以先找对应网站的数据接口,如果有数据接口则请求数据接口对应的网址,没有则用requests。
找数据接口的流程如下:
浏览器控制台--network--Fetch/XHR--刷新页面--左下角 xxxx.js--右边preview(具体数据)/headers(地址)
拿到数据接口的地址,对地址发送请求然后获取数据
import requests
response=requests.get('https://game.gtimg.cn/images/lol/act/img/js/hero/1.js')
result=response.json()
for i in result['skins']:
# 对图片地址发送请求
if i['iconImg']:
content = requests.get(i['iconImg']).content
else:
content = requests.get(i['chromaImg']).content
# 将图片写入文件
name=i['name']
with open(f'file1/{name}.jpg','wb') as f:
f.write(content)
import requests,os
resp=requests.get('https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js').json()
j=1
for i in resp['hero']:
# 每个英雄的名字,id
h_name = i['name']
id = i['heroId']
# 每个英雄的详细信息
resp1 = requests.get(f'https://game.gtimg.cn/images/lol/act/img/js/hero/{id}.js').json()
# print(f'https://game.gtimg.cn/images/lol/act/img/js/hero/{id}.js')
# 下载图片--创建文件夹
if not os.path.exists(f'file2/{h_name}'):
os.mkdir(f'file2/{h_name}')
# 下载文件
for k in resp1['skins']:
# 对图片地址发送请求
if k['iconImg']:
content = requests.get(k['iconImg']).content
else:
content = requests.get(k['chromaImg']).content
# 将图片写入文件
name = k['name']
with open(f'file2/{h_name}/{name}.jpg', 'wb') as f:
f.write(content)
j += 1
# j 用于控制英雄的个数,下载所有英雄的皮肤时间太长,暂定5个用于测试代码的可行性
if j >= 6:
break
print('下载完成')
import os
if not os.path.exists('file2/abc'):
os.mkdir('file2/abc')
查看浏览器的版本。下载与之对应的最接近的版本
下载之后解压,将文件放入与python.exe同一文件之下
b=Chrome()
b.get(url)
html=b.page_source
b.close()
from selenium.webdriver import Chrome
# 1、创建浏览器对象(浏览器是全局变量,不会自动关闭)
b=Chrome()
# 2、打开网页
# b.get('https://movie.douban.com/top250')
b.get('https://channel.chinanews.com.cn/cns/cl/gn-gcdt.shtml')
# 3、获取网页源代码--获取到的一定是页面中加载出来的
response=b.page_source
print(response)
# 4、关闭浏览器
b.close()
from selenium.webdriver import Chrome
from time import sleep
b=Chrome()
b.get('https://www.jd.com')
# 1、输入框输入内容
# 1.1 找到输入框
input_tag=b.find_element_by_id('key')
# 1.2 输入内容
input_tag.send_keys('电脑\n')
sleep(2)
# 2、点击按钮
# 2.1 找到需要点击的标签
click_tag=b.find_element_by_css_selector('#navitems-group2 .b')
# 2.2 点击标签
click_tag.click()
input('是否结束')
b.close()
# 3、切换选项卡
----未完待续,单独说明
注意: selenium中,浏览器对象(b)默认指向一开始打开的选项卡,除非用代码切换,否则浏览器对象指向的选项卡不会变
from selenium.webdriver import Chrome
from time import sleep
from bs4 import BeautifulSoup
# 1.基本操作
b = Chrome() # 创建浏览器
b.get('https://www.cnki.net/') # 打开中国知网
search_tag = b.find_element_by_id('txt_SearchText') # 获取输入框
search_tag.send_keys('数据分析\n') # 输入框输入"数据分析',然后按回车
sleep(1) # 切换界面最后做一个等待操作
# 获取需要点击的标签:如果拿到标签后需要点击或者输入,必须通过浏览器获取标签
all_result = b.find_elements_by_css_selector('.result-table-list .name>a')
# 点击第一个结果(打开一个新的选项卡)
all_result[0].click()
sleep(1)
# 2. 切换选项卡
# 注意: selenium中,浏览器对象(b)默认指向一开始打开的选项卡,除非用代码切换,否则浏览器对象指向的选项卡不会变
# #1)获取当前浏览器上所有的窗口(选项卡)∶浏览器.window_handles
# 2)切换选项卡
b.switch_to.window(b.window_handles[-1])
# 3)解析内容
soup = BeautifulSoup(b.page_source, 'lxml')
result = soup.select_one('#ChDivSummary').text
print(result)
b.close() # 关闭当前指向的窗口,窗口关闭后浏览器对象的指向不会发生改变
# 3、回到上一个页面
# 回到第一个窗口,点击下一个搜索结果
b.switch_to.window(b.window_handles[0])
all_result[1].click()
sleep(1)
b.switch_to.window(b.window_handles[-1])
soup = BeautifulSoup(b.page_source, 'lxml')
result = soup.select_one('#ChDivSummary').text
print(result)
b.close()
"""
Author:ting
date:2022/8/15 15:14
月薪过万
"""
import csv
from selenium.webdriver import Chrome
from bs4 import BeautifulSoup
from time import sleep
b = Chrome() # 创建浏览器对象
b.get('https://www.jd.com') # 打开网页
# 控制浏览器动作
input_tag = b.find_element_by_id('key')
page1 = input_tag.send_keys('手机\n')
sleep(4)
# 解析第一页的数据
html = b.page_source
soup = BeautifulSoup(html, 'lxml')
all_li = soup.select('#J_goodsList>ul>li')
# print(all_li)
new_list = []
for li in all_li:
price = li.select_one('.p-price i').text
name = li.select_one('.p-name em').text
new_list.append([name, price])
sleep(5)
# 点击下一页
click_tag=b.find_element_by_class_name('pn-next')
click_tag.click()
html=b.page_source
# 解析下一页的数据
soup = BeautifulSoup(html, 'lxml')
all_li = soup.select('#J_goodsList>ul>li')
for li in all_li:
name = li.select_one('.p-name em').text
price = li.select_one('.p-price i').text
new_list.append([name, price])
sleep(5)
b.close()
with open('file3/手机.csv', 'w', encoding='utf-8',newline='') as f:
writer = csv.writer(f)
writer.writerow(['手机名字', '价格'])
writer.writerows(new_list)
# writer.writerows(new_list1)
import csv
from bs4 import BeautifulSoup
from selenium.webdriver import Chrome
from time import sleep
# 解析内容的函数
def analysis_data(html: str):
soup = BeautifulSoup(html, 'lxml')
try:
result = soup.select_one('#ChDivSummary').text
except AttributeError:
result=' '
return result
b = Chrome()
b.get('https://www.cnki.net/')
input_tag = b.find_element_by_class_name('search-input')
input_tag.send_keys('数据分析\n')
sleep(2)
# 获取需要点击的标签
all_result = b.find_elements_by_css_selector('.result-table-list .name>a')
new_list=[]
for i in all_result[:3]:
i.click()
b.switch_to.window(b.window_handles[-1])
result = analysis_data(b.page_source)
new_list.append([result])
b.close()
b.switch_to.window(b.window_handles[0])
sleep(1)
print(new_list)
# 点击下一页并解析数据
click_tag = b.find_element_by_id('PageNext')
click_tag.click()
all_result = b.find_elements_by_css_selector('.result-table-list .name>a')
new_list1=[]
for i in all_result:
i.click()
b.switch_to.window(b.window_handles[-1])
result = analysis_data(b.page_source)
new_list1.append([result])
b.close()
b.switch_to.window(b.window_handles[0])
sleep(1)
sleep(1)
with open('file3/摘要.csv', 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerows(new_list)
# writer.writerows(new_list1)
b.close()
在有些页面中,需要滚动页面才会加载后续数据,因此在获取页面数据的时候需要用到页面自动滚动操作
在指定页面中,要先滚动页面,加载完成页面的数据才能获取页面内容,这样才不至于内容缺失
执行滚动操作 执行JS中滚动代码:window.scrollBy(x方向偏移量,y方向偏移量) b.execute_script('window.scrollBy(0,800)')
- 1
- 2
示例:
from selenium.webdriver import Chrome
from time import sleep
from bs4 import BeautifulSoup
b=Chrome()
b.get('https://www.jd.com')
b.find_element_by_id('key').send_keys('手机\n')
sleep(1)
for i in range(6):
b.execute_script('window.scrollBy(0,600)')
sleep(2)
print('----------------华丽的分割线----------------')
soup=BeautifulSoup(b.page_source,'lxml')
goods_list=soup.select('#J_goodsList>ul>li')
print(len(goods_list))
在用selenium爬取数据的过程中,浏览器上面有自动测试工具的提示,这个可以取消
有些网站可能因为图片过多而导致加载缓慢,有个操作可以不让该网站加载完所有图片
from selenium.webdriver import Chrome,ChromeOptions
options=ChromeOptions()
# 1、取消测试提示
options.add_experimental_option('excludeSwitches', ['enable-automation'])
# 2、取消图片加载
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
b=Chrome()
b.get('https://www.jd.com')