21天学Python --- 打卡10:Spider爬虫(高级)
1.Selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
驱动下载地址:
website: http://npm.taobao.org/mirrors/chromedriver/.
1.1无头模式
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
option = Options() # 实例化option对象
option.add_argument("--headless") # 给option对象添加无头参数
option.headless = True #这种方式也可以
if __name__ == '__main__':
web = Chrome(executable_path='D:\PyProject\spider\venv\Scripts\chromedriver.exe',options=option) # 指定驱动位置,否则从python解释器目录下查找.
web.get("https://baidu.com")
print(web.title)
1.2模拟输入和点击
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
option = Options() # 实例化option对象
option.add_argument("--headless") # 给option对象添加无头参数
if __name__ == '__main__':
web = Chrome()
web.maximize_window() # 浏览器窗口最大化
web.get("https://baidu.com")
el = web.find_element_by_id('kw')
el.send_keys('Harris-H')
btn = web.find_element_by_id('su')
btn.click()
# web.close() # 关闭当前网页
1.3标签定位
from selenium import webdriver
from lxml import etree
import time
bro = webdriver.Chrome(executable_path='./chromedriver.exe')
#逛淘宝
bro.get('https://tb.alicdn.com/snapshot/index.html')
#标签定位
search_input = bro.find_element_by_id('q')
search_input.send_keys('IPhone')
#执行js
bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(5)
#点击按钮
btn = bro.find_element_by_css_selector('.btn-search')
btn.click()
#也可以继续请求
bro.get('htts://www.baidu.com')
time.sleep(2)
bro.back()
time.sleep(2)
time.sleep(5)
bro.quit()
1.4模拟登录
from selenium.webdriver import Chrome
if __name__ == '__main__':
web = Chrome()
web.get('http://bkjx.wust.edu.cn/')
username = web.find_element_by_id('userAccount')
username.send_keys('xxxxxxx') # 这里填自己的学号
password = web.find_element_by_id('userPassword')
password.send_keys('xxxxxxx') # 这里填自己的密码
btn = web.find_element_by_xpath('//*[@id="ul1"]/li[4]/button')
btn.click()
# do something
1.5使用代理
from selenium import webdriver
import time
options = webdriver.ChromeOptions()
options.add_argument('--proxy-server=http://ip地址') # 代理IP:端口号
# ${chromedriver_path}: chromedriver驱动存放路径
driver = webdriver.Chrome(options=options)
driver.get("https://dev.kdlapi.com/testproxy")
# 获取页面内容
print(driver.page_source)
# 延迟3秒后关闭当前窗口,如果是最后一个窗口则退出
time.sleep(3)
driver.close()
1.6滑块验证
"""
目标:滑动验证码
1.定位按钮
2.按住滑块
3.滑动按钮
"""
import time
from selenium import webdriver
if __name__ == '__main__':
chrome_obj = webdriver.Chrome()
chrome_obj.get('https://www.helloweba.net/demo/2017/unlock/')
# 1.定位滑动按钮
click_obj = chrome_obj.find_element_by_xpath('//div[@class="bar1 bar"]/div[@class="slide-to-unlock-handle"]')
# 2.按住
# 创建一个动作链对象,参数就是浏览器对象
action_obj = webdriver.ActionChains(chrome_obj)
# 点击并且按住,参数就是定位的按钮
action_obj.click_and_hold(click_obj)
# 得到它的宽高
size_ = click_obj.size
width_ = 298 - size_['width'] # 滑框的宽度 减去 滑块的 宽度 就是 向x轴移动的距离(向右)
print(width_)
# 3.定位滑动坐标
action_obj.move_by_offset(298-width_, 0).perform()
# 4.松开滑动
action_obj.release()
time.sleep(6)
chrome_obj.quit()
2.Scrapy
Scrapy是一个可以爬取网站数据,为了提取结构性数据而编写的开源框架。
在Scrapy的工作流程中主要包括以下几个部分:
Scrapy Engine(框架的引擎):
用于处理整个系统的数据流,触发各种事件,是整个框架的核心。
Scheduler(调度器):
用于接收引擎发过来的请求,添加至队列中,在引擎再次请求时将请求返回给引擎。可以理解为从URL队列中取出一个请求地址,同时去除重复的请求地址。
Downloader(下载器):
用于从网络下载Web资源。
Spiders(网络爬虫):
从指定网页中爬取需要的信息。
Item Pipline(项目管道):
用于处理爬取后的数据,例如数据的清洗、验证以及保存。
Downloader Middlewares(下载器中间件):
位于Scrapy引擎和下载器之间,主要用于处理 引擎与下载器之间的网络请求与响应。
Spider Middlewares(爬虫中间件):
位于爬虫与引擎之间,主要用于处理爬虫的响应输入和请求输出。
Scheduler Middlewares(调度中间件):
位于引擎和调度之间,主要用于处理从引擎发送到调度的请求和响应。
pip install scrapy
2.1create project
scrapy startproject scrapyDemo
spiders(文件夹):
用于创建爬虫文件,编写爬虫规则。__ init __文件:
初始化文件。items文件:
用于数据的定义,可以寄存处理后的数据。middlerwares文件:
定义爬取时的中间件,其中包括SpiderMiddleware(爬虫中间件)、DownloaderMiddleware(下载中间件)pipelines文件:
用于实现清洗数据、验证数据、保存数据。settings文件:
整个框架的配置文件,主要包含配置爬虫信息,请求头、中间件等。scrapy.cfg文件:
项目部署文件,其中定义了项目等配置文件路径等相关信息。
import scrapy
class QuotesSpider(scrapy.Spider):
# 定义爬虫名称
name = 'quotes_1'
def start_requests(self):
# 设置爬取目标的地址
urls = [
'http://quotes.toscrape.com/page/1/',
'http://quotes.toscrape.com/page/2/',
]
# 获取所有地址,有几个地址则发送几个请求
for url in urls:
# 发送请求
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
# 获取页数
page = response.url.split('/')[-2]
# 根据页数设置文名称
filename = 'quotes-%s.html' % page
# 以写入文件模式打开文件,如果没有该文件将创建该文件
with open(filename, 'wb') as f:
# 向文件中写入获取的HTML代码
f.write(response.body)
# 输出保存文件的名称
self.log('Saved file %s' % filename)
scrapy crawl quotes_1