Scrapy学习-16-动态网页技术

Posted 陈乾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scrapy学习-16-动态网页技术相关的知识,希望对你有一定的参考价值。

Selenium浏览器自动化测试框架
简介
  •   Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
  •   支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
  •   这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。
  •   测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本
 
功能
  •   框架底层使用javascript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
  •   使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
  •   使用简单,可使用Java,Python等多种语言编写用例脚本
 
安装
1 pip install selenium

 

官方文档
1 http://selenium-python.readthedocs.io/

 

驱动下载
Chrome  https://sites.google.com/a/chromium.org/chromedriver/downloads

Edge    https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

Firefox https://github.com/mozilla/geckodriver/releases

 

基本使用之模拟登陆知乎
from selenium import webdriver
from scrapy.selector import Selector

browser = webdriver.Chrome(
    executable_path="E:\Python Project\scrapyproject\_ArticleSpider\chromedriver_win32\chromedriver.exe"
)

browser.get("https://www.zhihu.com/#signin")

browser.find_element_by_css_selector(".view-signin input[name=‘account‘]").send_keys("18412542552")
browser.find_element_by_css_selector(".view-signin input[name=‘password‘]").send_keys("as15fQAfa")

browser.find_element_by_css_selector(".view-signin button.sign-button").click()

# browser.quit()

 

基本使用之模拟登陆微博并下拉滚动条
from selenium import webdriver
import time

browser = webdriver.Chrome(
    executable_path="E:\Python Project\scrapyproject\_ArticleSpider\chromedriver_win32\chromedriver.exe"
)

browser.get("https://weibo.com/")

time.sleep(5)
browser.find_element_by_css_selector("#loginname").send_keys("<username>")
browser.find_element_by_css_selector(".info_list.password input[node-type=‘password‘]").send_keys("<password>")
browser.find_element_by_css_selector(".info_list.login_btn a[node-type=‘submitBtn‘]").click()

for i in range(3):
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight); var lenOfPage=document.body.scrollHeight; return lenOfPage;")
    time.sleep(3)

# browser.quit()

 

基本使用之不加载图片提升页面加载速度
from selenium import webdriver

chrome_opt = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images":2}
chrome_opt.add_experimental_option("prefs", prefs)

browser = webdriver.Chrome(
    executable_path="E:\Python Project\scrapyproject\_ArticleSpider\chromedriver_win32\chromedriver.exe",
    chrome_options=chrome_opt
)

browser.get("https://www.taobao.com/")

# browser.quit()

 

基本使用之隐藏chrom图形界面
注意: 目前只能在linux中使用
 
下载相关模块
1 pip install pyvirtualdisplay
相关依赖下载
sudo apt-get install xvfb

pip install xvfbwrapper
使用步骤
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()

browser = webdriver.Chrome(
    executable_path="E:\Python Project\scrapyproject\_ArticleSpider\chromedriver_win32\chromedriver.exe"
)

browser.get(https://www.taobao.com/)

# browser.quit()

 

基本使用之phantomjs
特点
  •   无界面的浏览器,效率高
  •   在linux无图形化界面时使用较多
  •   多进程下phantomjs性能会严重下降
  •   多线程执行时不稳定
 
下载
1 http://phantomjs.org/download.html
简单使用
from selenium import webdriver

browser = webdriver.PhantomJS(
    executable_path="E:\Python Project\scrapyproject\_ArticleSpider\phantomjs-2.1.1-windows\bin\phantomjs.exe"
)

browser.get("https://item.taobao.com/item.htm?id=558638145403&ali_refid=a3_430673_1006:1109358544:N:%E6%89%8B%E6%9C%BA%E8%8B%B9%E6%9E%9C%E6%89%8B%E6%9C%BA:5d77c360cd1e64043b2f430be7531705&ali_trackid=1_5d77c360cd1e64043b2f430be7531705&spm=a2e15.8261149.07626516002.2")
print(browser.page_source)

browser.quit()

 

集成selenium到scrapy框架中
为每一个spider创建一个chrom浏览器对象
import scrapy
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals
from selenium import webdriver

class JobboleSpider(scrapy.Spider):
    name = "jobbole"
    allowed_domains = ["blog.jobbole.com"]
    start_urls = [http://blog.jobbole.com/all-posts/]

    def __init__(self):
        self.browser = webdriver.Chrome(
            executable_path="E:\Python Project\scrapyproject\_ArticleSpider\chromedriver_win32\chromedriver.exe"
        )
        super(JobboleSpider, self).__init__()
        dispatcher.connect(self.spider_closed, signals.spider_closed)

    def spider_closed(self, spider):
        self.browser.quit()

    def parse(self, response):
        pass
编写middleware在下载时使用chrom打开网页
import time
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):

    def process_request(self, request, spider):
        if spider.name == "jobbole":
            spider.browser.get(request.url)
            time.sleep(3)
            return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)
配置settings
DOWNLOADER_MIDDLEWARES = {
    ArticleSpider.middlewares.JSPageMiddleware: 1,
}

 

重写downloader实现selenium支持异步请求
需要我们熟悉并遵守scrapy编程规范,可以参考
1 https://github.com/flisky/scrapy-phantomjs-downloader

 

其它浏览器自动化测试工具
更加轻量型的加载动态页面的工具splash、grid
特点
  •   比chrom和phantomjs性能更优
  •   支持分布式爬虫
  •   稳定性不如chrom高
splash-github项目
1 https://github.com/scrapy-plugins/scrapy-splash
selenium扩展grid
1 https://www.oschina.net/question/tag/selenium-grid

 

其它浏览器自动化测试工具splinter (纯python开发)
1 https://github.com/cobrateam/splinter

 

 

以上是关于Scrapy学习-16-动态网页技术的主要内容,如果未能解决你的问题,请参考以下文章

使用scrapy-selenium, chrome-headless抓取动态网页

Scrapy抓取动态网页

爬虫:网页里元素的xpath结构,scrapy不一定就找的到

关于Scrapy爬取1000张网页的问题

scrapy主动退出爬虫的代码片段(python3)

JSP基础