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