selenium动态网页与请求简单学习

一、简介
selenium是一个用于web应用程序测试工具,可以直接运行在浏览器,就像用户在操作一样。
二、文档
apiurl

安装:进入虚拟环境,pip install selenium

三、使用selenium登陆微博

from selenium import webdriver
from scrapy.selector import Selector
import time

browser = webdriver.Chrome(executable_path='D:\Chrome Download\chromedriver_win32\chromedriver.exe')   #chrom driver的路径

browser.get('https://weibo.com/')
#browser也提供了很多获取元素的方法但是会比scrapy的慢,所以尽量用scrapy
time.sleep(15)

#selenium 微博模拟登陆
browser.find_element_by_css_selector('#loginname').send_keys('账号')  #输入账号
browser.find_element_by_css_selector('.info_list.password input[type="password"]').send_keys('密码')  #输入密码
browser.find_element_by_css_selector('.info_list.login_btn a[node-type="submitBtn"]').click()  #点击

四、使用selenium控制鼠标下拉

browser.get('https://www.oschina.net/blog/')
time.sleep(15)
for i in range(3):
    browser.execute_script(''
                           'window.scrollTo(0,document.body.scrollHeight);'
                           ' var lenOfPage = document.body.scrollHeight;'
                           'return lenOfPage;'
                           )
    time.sleep(3)

五、设置不加载图片

#设置chromedriver不加载图片

chrome_opt = webdriver.ChromeOptions()
prefs = {'profile.managed_default_content_settings.images': 2}   #把这个设置为2就是不加载图片
chrome_opt.add_experimental_option('prefs', prefs)  #把设置的值放进去
browser = webdriver.Chrome(executable_path='D:\Chrome Download\chromedriver_win32\chromedriver.exe',chrome_options=chrome_opt)   #chrom driver的路径
browser.get('https://www.taobao.com')

六 phantomjs

#phantomjs,无界面的浏览器,多进程情况下phantomjs性能会下降很严重
browser = webdriver.PhantomJS(executable_path='D:/Chrome Download/phantomjs-2.1.1-windows/bin/phantomjs.exe')   #phantomjs的路径
browser.get('https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w5003-18178698956.4.2673684cOq4jIr&id=586987010790&scene=taobao_shop')
print(browser.page_source)
browser.quit()

七、selenium集成到scrapy中
在middleware中添加

from selenium import webdriver
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):
    # 初始化browser 这样就不用没请求一个地址打开一个浏览器了
    def __init__(self):
        self.browser = webdriver.Chrome(
            executable_path='D:\Chrome Download\chromedriver_win32\chromedriver.exe')  # chrom driver的路径
        super(JSPageMiddleware, self).__init__()

    # 通过chrome请求动态网页
    def process_request(self, request, spider):
        if spider.name == 'nga':
            self.browser.get(request.url)
            import time
            time.sleep(5)
            print('访问:{0}'.format(request.url))
            # 在这里通过Chrome请求之后让它不再发送到下载器,没必要再去下载一遍了
            # 通过返回来的browser.page_source对HtmlResponse做初始化就可以了
            # 一旦遇到HtmlResponse,scrapy就不会再向downloader发送而是返回给spider
            return HtmlResponse(url=self.browser.current_url, body=self.browser.page_source, encoding='utf-8',
                                request=request)

更改settngs文件:

DOWNLOADER_MIDDLEWARES = {
    #'NgaSpider.middlewares.NgaspiderDownloaderMiddleware': 543,
    'NgaSpider.middlewares.JSPageMiddleware': 1,

}```

可以直接把Chrome初始化代码放到scrapy中,


from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals
def init(self):
self.browser = webdriver.Chrome(
executable_path=‘D:\Chrome Download\chromedriver_win32\chromedriver.exe’) # chrom driver的路径
super(NgaSpider, self).init()
dispatcher.connect(self.spider_close,signals.spider_closed)

def spider_close(self,spider):
    #当爬虫退出时关闭Chrome
    print('spider closed')
    self.browser.quit()
    ...
更改middleware为:

from scrapy.http import HtmlResponse
class JSPageMiddleware(object):

# 通过chrome请求动态网页
def process_request(self, request, spider):
    if spider.name == 'nga':
        spider.browser.get(request.url)
        import time
        time.sleep(5)
        print('访问:{0}'.format(request.url))
        # 在这里通过Chrome请求之后让它不再发送到下载器,没必要再去下载一遍了
        # 通过返回来的browser.page_source对HtmlResponse做初始化就可以了
        # 一旦遇到HtmlResponse,scrapy就不会再向downloader发送而是返回给spider
        return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding='utf-8',
                            request=request)
这里使用了信号量,当爬虫关闭时调用spider_close方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章