Scrapy爬虫系列笔记之八:Selenium进行动态网站爬取_by_书訢

建议参照目录大纲,即笔记第一篇来了解大致路线后进行博客查阅。每大章的分支都十分清楚。

2.5动态网站爬取之Selenium

2.5.1简单介绍selenum以及hello world

Selenium是什么呢?百度百科:

直接上手:
1.搜索 selenium python api driver
进入下载对应的driver

2.pip 安装selenium
以下是Hello World,基础使用代码

from selenium import  webdriver
from scrapy.selector import Selector
brower =webdriver.Chorm(executable_path="driver路径")
brower.get("想要进行访问的网址")
t_selector = Selector(text=browser.page_source)
t_selector.css("选择器内容")
#同时也可以通过brower对象得到页面的控件
button =brower.find_element_by_css_selector("选择器内容")
button.click()
#也可以进行执行js代码
brower.execute_script("window.scrollTo(0,document.body.scrollHeight);")
2.5.2将selenium集成到scrapy中

1.编写中间件(使用浏览器进行请求网页)

from scrapy.http import HtmlResponse
from selenium import webdriver
from scrapy.selector import Selector
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile
class JSPageMiddleware(object):
    #通过fireFox请求动态网页
    def process_request(self, request, spider):
    spider.brower.get(request.url)
    import time
time.sleep(2)
return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)

2.更改设置中关于中间件的:
后面的数字表示优先级,数字越小优先级越高

这样设置以后,url就会使用这个中间件进行下载

之后只要像之前最开始静态网站中一样书写就OK了,其实只是套了一个中间件,使用了浏览器的解析器进行js代码的执行

最后附我动态爬取一个文书网的代码(可能之后网站改变以后爬不成功,需要使用之前的Mian脚本文件进行启动):

import scrapy
from ArticleSpider.items import LawItem
from urllib import parse
from scrapy.http import Request
import re
from scrapy.http import HtmlResponse
from selenium import webdriver
from scrapy.selector import Selector
from selenium.webdriver.firefox.firefox_profile >     >     import FirefoxProfile
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals

class WenshuSpider(scrapy.Spider):

name = 'wenshu'
allowed_domains = ['wenshu.court.gov.cn']
start_urls = ["http://openlaw.cn/search/judgement/default?type=&typeValue=&courtId=&lawFirmId=&lawyerId=&docType=&causeId=&judgeDateYear=&lawSearch=&litigationType=&judgeId=&procedureType=&judgeResult=&courtLevel=&procedureType=&zone=&keyword=%E4%BC%81%E4%B8%9A"]
def __init__(self):
    firefoxProfile = FirefoxProfile()
    ##禁用CSS
    firefoxProfile.set_preference('permissions.default.stylesheet', 2)
    ##禁用图像
    firefoxProfile.set_preference('permissions.default.image', 2)
    ##禁用Flash
    firefoxProfile.set_preference('dom.ipc.plugins.enabled.libflashplayer.so', 'false')
    ##设置修改后的配置文件创建浏览器对象
    self.brower = webdriver.Firefox(
        executable_path="D:\PythonIDE\Tools\geckodriver-v0.19.1-win32\geckodriver.exe",
        firefox_profile=firefoxProfile)
    super(WenshuSpider, self).__init__()
    #定义一个信号量,第一个是信号量变化时候调用的函数,第二个参数是信号量,爬虫退出时候关闭浏览器
    dispatcher.connect(self.spider_closed, signals.spider_closed)

def spider_closed(self,spider):
    print("closed")
    self.brower.quit()

def parse(self, response):
    '''
    1.首先将文书在哪个列表页中的URL交给scrapy进行下载并parse进行解析
    2.获取下一页的url并交给scrapy进行下载,下载后直接交给parse,不调用解析函数
    '''
    ##对应文章标题的css的css的css样式,得到一页中文章的url
    page_source = self.find_elements_by_xpath('//h[@class="entry-title"]/a')
    for Article_url in page_source:
        print(Article_url)
    for Article_url in page_source:
        yield Request(url=Article_url,callback=self.parse_detail)
    ##上面使用前一个url得到域名,再将url进行拼接
    ##下一页并交给scarpy进行下载,如果存在的话使用parse
    ##这个是需要点检以后才能操作的,下一页
    nextButton = self.brower.find_element_by_css_selector(".next")
    if nextButton:
       nextButton.click()
       yield Request(url=self.brower.current_url,callback=parse)

def parse_detail(self,response):
    txtName = "newCode.txt"
    f = open(txtName, "a+")
    import time
    time.sleep(1)
    f.write(response.xpath("")+ "\n")
    f.close()
    time.sleep(3)
    yield LawItem


笔记一到十链接
http://blog.csdn.net/sx_csu2016sw/article/details/79284369
http://blog.csdn.net/sx_csu2016sw/article/details/79284427
http://blog.csdn.net/sx_csu2016sw/article/details/79284449
http://blog.csdn.net/sx_csu2016sw/article/details/79284469
http://blog.csdn.net/sx_csu2016sw/article/details/79284481
http://blog.csdn.net/sx_csu2016sw/article/details/79284491
http://blog.csdn.net/sx_csu2016sw/article/details/79284509
http://blog.csdn.net/sx_csu2016sw/article/details/79284525
http://blog.csdn.net/sx_csu2016sw/article/details/79284547
http://blog.csdn.net/sx_csu2016sw/article/details/79284567

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值